Java正则表达式匹配含换行的数字文本分组问题
解决Java正则提取「14位数字+空格+文本」的换行分组问题
你的问题核心在于默认正则规则的限制,以及没有正确利用多行匹配模式。咱们一步步来解决:
问题根源
你原来的正则(\d{14}\s.*\n)有两个关键问题:
- 默认情况下,
.不会匹配换行符,虽然你的正则里跟着\n能匹配到行尾换行,但如果不循环查找所有匹配项,只会捕获第一个符合条件的内容; \n仅能匹配Unix风格的换行,对Windows的\r\n或旧Mac的\r兼容性较差。
最优解决方案(Java代码示例)
我们可以利用Java的Pattern.MULTILINE模式,让正则锚点$匹配每行的结尾,精准捕获每一行符合格式的内容:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class LineMatcher { public static void main(String[] args) { // 你的测试文本 String input = """ 59105999000321 My value start with new line number 12105999000343 AAAAAasasas asdasdasd 32105999000323 asdasxasxasx asdasd """; // 正则规则:捕获14位数字+空格+该行剩余所有内容 Pattern pattern = Pattern.compile("(\\d{14}\\s.*)$", Pattern.MULTILINE); Matcher matcher = pattern.matcher(input); // 循环查找所有匹配项 int groupIndex = 1; while (matcher.find()) { System.out.printf("group %d : %s%n", groupIndex++, matcher.group(1)); } } }
代码解释
Pattern.MULTILINE:开启后,$会匹配每行的末尾(而非整个字符串的结尾),这是实现逐行捕获的核心;\d{14}:精准匹配14位数字;\s:匹配单个空格(如果允许多个空格,改成\s+即可);.*:匹配该行剩余的所有字符(默认.不匹配换行,刚好停在换行前);$:锚定到行尾,确保捕获的是整行符合格式的内容。
兼容所有换行格式的替代方案
如果需要适配不同操作系统的换行符(\r\n、\n、\r),可以用Java 8+支持的\R匹配任意换行,正则写法如下:
Pattern pattern = Pattern.compile("(\\d{14}\\s.*?)(?=\\R|\\Z)");
这里(?=\\R|\\Z)是正向预查,意思是“后面跟着换行符或者字符串结尾”,.*?是非贪婪匹配,确保不会跨多行捕获内容。
运行上述代码,就能得到你期望的分组结果啦!
内容的提问来源于stack exchange,提问作者Mister B
相关产品推荐
相关产品推荐

