Java Regex与换行符不匹配

Dra*_*gos 4 java regex

我的代码如下:

public class Test {
    static String REGEX = ".*([ |\t|\r\n|\r|\n]).*";
    static String st = "abcd\r\nefgh";

    public static void main(String args[]){
        System.out.println(st.matches(REGEX));
    }
}
Run Code Online (Sandbox Code Playgroud)

代码输出false.在任何其他情况下,它按预期匹配,但我无法弄清楚这里的问题是什么.

Avi*_*Raj 5

您需要删除字符类.

static String REGEX = ".*( |\t|\r\n|\r|\n).*";
Run Code Online (Sandbox Code Playgroud)

你不能放入\r\n一个角色类.如果你这样做,它会被当作\r,\n作为两个独立的项目,后者又匹配任何\r\n.你已经知道它.*不匹配任何换行符,所以.*匹配第一部分,下一个char类匹配单个字符,即\r.现在,以下字符\n将不匹配.*,因此您的正则表达式失败了.


Wik*_*żew 3

更新

根据您的评论,您需要这样的东西:

.*(?:[ \r\n\t].*)+
Run Code Online (Sandbox Code Playgroud)

解释

简单来说,它是一个匹配一行、然后 1 行或多行的正则表达式。或者,只是多行文本

  • .*- 除换行符外的 0 个或多个字符
  • (?:[ \r\n\t].*)+- 匹配 1 次或多次序列的非捕获组
    • [ \r\n\t]- 一个空格,或者一个\r\n\t
    • .*- 除换行符外的 0 个或多个字符

查看演示

原答案

您可以通过两种方式修复您的模式:

String REGEX = ".*(?:\r\n|[ \t\r\n]).*";
Run Code Online (Sandbox Code Playgroud)

这样我们就可以匹配\r\n序列或字符类中的任何字符。

或者(由于字符类只匹配 1 个字符,我们可以+在其后面添加以捕获 1 个或多个:

String REGEX = ".*[ \t\r\n]+.*";
Run Code Online (Sandbox Code Playgroud)

查看IDEONE 演示

请注意,交替使用单个字符不是一个好主意,它会降低性能。

另请注意,不应过度使用捕获组。如果您不打算使用该组的内容,请使用非捕获组 ( (?:...)),或将其删除。