Java正则表达式来查找特定长度的多行
我试图使用Java正则表达式来匹配跨多行的模式。该模式有一行以“A”开头,后跟50个字符,然后有一行或多行以“B”开头,后跟50个字符:Java正则表达式来查找特定长度的多行,java,regex,Java,Regex,我试图使用Java正则表达式来匹配跨多行的模式。该模式有一行以“A”开头,后跟50个字符,然后有一行或多行以“B”开头,后跟50个字符: A... // exactly 50 chars after the A B... B... 然而,Java正则表达式似乎不支持这一点 下面是一个适用于一个a和一个B行的regexp: A.{50}[\\n[\\n\\r]]B.{50}[\\n[\\n\\r]] 这里修改了相同的regexp以查找一个或多个B行: A.{50}[\\n[\\n\\r
A... // exactly 50 chars after the A
B...
B...
然而,Java正则表达式似乎不支持这一点
下面是一个适用于一个a和一个B行的regexp:
A.{50}[\\n[\\n\\r]]B.{50}[\\n[\\n\\r]]
这里修改了相同的regexp以查找一个或多个B行:
A.{50}[\\n[\\n\\r]][B.{50}[\\n[\\n\\r]]]+
但是,此regexp仅在第一个B行上查找前导B字符
我使用[\\n[\\r\\n]]
处理DOS和UNIX换行符。启用多行模式不会影响结果
问题似乎是当我使用带“+”的括号将B行的regexp转换为可以捕获多行的字符类时
Java正则表达式中是否有不允许“.”字符或大括号指定精确行长的内容?要处理Unix和Dos样式的换行符,可以使用:
\\r?\\n
另外,您对一行或多行B
进行分组的方式不正确,您正在使用[]
进行分组,您应该使用(?:)
试试这个正则表达式:
A.{50}\\r?\\n(?:B.{50}(?:\\r?\\n)?)+
在以下正则表达式中:
(A[^\r\n]{50}(\r\n|\n))(B[^\r\n]{50}(\r\n|\n))+
我使用[^\r\n]
匹配任何不是\r
或\n
的字符。例如,如果您有数字,可以将其替换为[\d]
看
在本例中,正则表达式匹配除最后一行之外的所有行。这应该可以:
String input = "A1234567890\nA12345678\nA12345678\nB12345678\nA123456\nA1234567\nZA12345678\nB12345678\nA12345678\nB12345678\nB12345678\nB12345678\nB1234567\nA12345678\nB12345678";
String regex = "^A.{8}$((\\r|\\r\\n|\\n)^B.{8}$)+(\\r|\\r\\n|\\n|\\z)";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("matches from " + matcher.start() + " to " + matcher.end());
}
注:
^
、$
和多行
避免与以“ZA”开头的行匹配(\\r | \\r\\n | \\n)
匹配unix、windows和旧的mac os线路(\\r | \\r\\n | \\n | \\z)
匹配最后一行没有行尾的B行Opsss,我用
8
代替50
来增加可读性。点和花括号很好;你剩下的正则表达式都错了。看看这个:
Pattern p = Pattern.compile("^A.{50}(?:(?:\r\n|[\r\n])B.{50})+$");
(?:\r\n |[\r\n])
匹配CRLF序列、仅CR序列或仅LF序列。(我本可以像你一样使用两个反斜杠,但这也行)
如果使用正则表达式从一些较大的文本中提取匹配项,则需要以多行模式编译它,以便
^
和$
锚定可以在行边界处匹配。如果要匹配整个字符串,请将其保留为默认模式,以便它们仅在字符串的开头和结尾匹配。匹配换行符序列的正确方法是:
"(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029)"
当然,这是用Java的Slackbash字符串表示法,就像您可能传递到Pattern.compile
一样。更合理的语言让您只需满足以下要求:
(?:(?>\x0D\x0A)|\v)
但是,Java的正则表达式从来都不是那么合理,即使是这样,对Java来说,这也是一种严重的轻描淡写。Java只是它的正则表达式的无数麻烦点之一
祝你好运:你会需要它的。☹ 这也应该有效:
Pattern regex = Pattern.compile("^A.{50}$\\s+(?:^B.{50}$\\s*)+(?:^|\\z)", Pattern.MULTILINE);
这背后的原因是,^
在行首匹配,$
在行尾(可选)换行符之前匹配,\s
匹配包含\r
和\n
的空格。因为我们在$
和^
之间使用它,所以它只能匹配换行符,不能匹配其他空格
(?:^ | \\z)
用于确保在最后一次重复B
行之后,不会意外地匹配行中的任何前导空格。如果行从不以空格开头,则可以删除此位。有一行A在“A”之后有50个字符,然后有多行B在“B”之后有50个字符。stackoverflow没有保留我上面显示的A行和B行之间的换行符。只是为了它,因为你发布了一个ruby版本。这是一个很棒的正则表达式测试程序的python版本。不,第一行是一个不匹配行的示例。