Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式来查找特定长度的多行_Java_Regex - Fatal编程技术网

Java正则表达式来查找特定长度的多行

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

我试图使用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]][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版本。不,第一行是一个不匹配行的示例。