Java正则表达式不匹配换行符

6

我的代码如下:

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));
    }
}

代码输出false。在其他情况下,它按预期匹配,但我无法弄清楚这里的问题在哪里。

2
[ |\t|\r\n|\r|\n] 的实际含义是 [ \t\r\n|],也就是说,它只匹配方括号内所包含的字符集合中的一个字符。 - laune
哦,我明白了。谢谢! - Dragos
2个回答

5
您需要删除字符类。
static String REGEX = ".*( |\t|\r\n|\r|\n).*";

您不能在字符类中放置\r\n。如果这样做,它将被视为\r\n作为两个单独的项,进而匹配\r\n。您已经知道.*不会匹配任何换行符,因此.*匹配第一部分,接下来的字符类将匹配一个单个字符,即\r。现在下一个字符是\n,它不会被.*匹配,因此您的正则表达式失败了。

3

更新:

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

.*(?:[ \r\n\t].*)+

解释:

简单地说,它是一个可以匹配一行文本,接着匹配1个或多个行文本的正则表达式。或者说,它是一个匹配多行文本的正则表达式。

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

请参见演示

原始回答

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

String REGEX = ".*(?:\r\n|[ \t\r\n]).*";

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

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

String REGEX = ".*[ \t\r\n]+.*";

请查看IDEONE演示

请注意,在替代中使用单个字符不是好的选择,会降低性能。

还要注意,不能过度使用捕获组。如果您不打算使用该组的内容,请使用非捕获组((?:...))或删除它们。


我现在有一个新问题。正则表达式无法匹配包含多个换行符的字符串。我该如何解决这个问题? - Dragos
请提供一个示例字符串和期望的输出。 - Wiktor Stribiżew
是的,但你也可以使用 .*(?:[ \t\r\n]+.*)*。然而,我不明白它的意义在哪里。你可以使用 (?s) 启用 dotall,但是 (?s).* 有什么好处呢? - Wiktor Stribiżew
不知何故,它现在与我输入的任何字符串匹配。 - Dragos
请澄清你正在做什么,最好更新问题本身。为什么Sample\nString\nNo\nMatch会匹配?标准是什么?任何包含空格的字符串?那么请尝试.*(?:[ \t\r\n]+.*)+ - Wiktor Stribiżew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接