
本文介绍如何使用单行Java正则表达式,将字符串中恰好2个或9个连续换行符分别缩减为1个或8个,避免多层if判断与重复replace,兼顾Java 8兼容性与代码简洁性。
本文介绍如何使用单行java正则表达式,将字符串中**恰好2个或9个连续换行符**分别缩减为1个或8个,避免多层if判断与重复replace,兼顾java 8兼容性与代码简洁性。
在文本处理中,有时需对换行符数量进行精细化控制——例如,仅当出现严格两个或严格九个连续换行符(
)时,各减去一个,其余数量(如1、3、8、10等)保持不变。这种“精确匹配并局部替换”的需求,无法通过简单replace("
", "
")实现(会误改3个
中的前两个),也不宜用冗长的条件分支。
推荐解法是使用负向断言 + 分组捕获 + 反向引用的正则组合:
str = str.replaceAll("(?<p>✅ <strong>原理详解</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10235" title="sc-java-to-ts-interface"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20e352aa140.jpg" alt="sc-java-to-ts-interface" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill10235" title="sc-java-to-ts-interface" class="overflowclass">sc-java-to-ts-interface</a>
<p class="overflowclass">将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。</p>
</div>
<a rel="nofollow" href="/xiazai/skill10235" title="sc-java-to-ts-interface" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
(?:负向先行断言,确保匹配位置前<strong>不是</strong>换行符(即匹配必须位于换行序列开头);-
(\n{8}|\n):捕获组,匹配8个换行符或1个换行符(对应原序列中“第1–8个”或“第1个”); -
\n:紧随其后的第9个或第2个换行符(即要被移除的那个); -
(?! ):负向后行断言,确保该换行符后不是换行符(保证总数恰好为2或9); -
$1:仅保留捕获组内容,自然实现“减1”效果。
? 注意事项:
- Java中反斜杠需双写(
\n),切勿遗漏; - 此正则在Java 8+完全可用,无需额外依赖;
- 若文本含
(Windows换行),需先标准化为,或改用( ? )适配; - 测试建议覆盖边界场景:
" "→" "," ".repeat(9)→" ".repeat(8)," "→ 保持不变。
该方案以一行正则替代多步字符串操作,逻辑清晰、性能高效,是处理此类精确计数替换问题的典型范式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










