Java Regex与换行符不匹配

时间:2015-07-13 08:26:58

标签: 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));
    }
}

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

2 个答案:

答案 0 :(得分:5)

您需要删除字符类。

static String REGEX = ".*( |\t|\r\n|\r|\n).*";

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

答案 1 :(得分:1)

<强>更新

根据您的评论,您需要以下内容:

def

<强>说明

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

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

请参阅demo

原始回答

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

.*

这样我们匹配String REGEX = ".*(?:\r\n|[ \t\r\n]).*"; 序列或字符类中的任何字符。

或者(因为角色类只匹配1个字符,我们可以在其后添加\r\n来捕获1个或更多:

+

请参阅IDEONE demo

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

另请注意,不应过度使用捕获组。如果您不打算使用该组的内容,请使用非捕获组(String REGEX = ".*[ \t\r\n]+.*"; ),或将其删除。

相关问题