【问题标题】:How to match any symbol including a line terminator?如何匹配任何符号,包括行终止符?
【发布时间】:2018-05-06 02:04:52
【问题描述】:

我有一个文本“文本 abc”。当我使用“(.+) abc”模式时,我发现匹配“文本”,没关系。但如果我使用第二个模式“([.]{1,}) abc”,匹配器找不到任何匹配项。为什么?

我想使用大括号 [],因为我还想使用换行符(例如,现在我无法将“text \n abc”与第一个模式匹配。

对不起我的英语不好

另见 DOTALL 模式:https://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DOTALL

我的代码:

    String text = "text abc";
    Pattern pattern = Pattern.compile("(.+) abc");
    Matcher m = pattern.matcher(text);
    while (m.find()) {
        System.out.println(m.group(1));
    }

PS:我的目标是使用类似 "([.\n]{1,}) abc" 模式。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    不清楚您要匹配什么,但如果我理解正确,您的问题在于“text \n abc”。那是因为用换行符来解决这个问题

    Pattern pattern = Pattern.compile("(.+) abc", Pattern.DOTALL);
    

    "." 的 Pattern.DOTALL 标志甚至匹配 \r 或 \n。

    【讨论】:

      【解决方案2】:

      现在,([.\n]{1,}) abc 模式相当落后。首先,{1,}+ 相同,所以这个模式实际上是([.\n]+) abc。其次,如 Oracle 正则表达式教程中所述:

      注意:在某些情况下,上面列出的特殊字符不会被视为元字符。

      [.] 的情况下,. 不再是正则表达式元字符。您可以通过针对字符串"test . abc" 测试模式来验证这一点,该字符串将分组"."

      要启用DOTALL 标志,只需将参数添加到正则表达式,或者您可以将选项添加为参数:

      Pattern pattern = Pattern.compile("(?s)(.+) abc")
      

      Pattern pattern = Pattern.compile("(.+) abc", Pattern.DOTALL)
      

      Note reference

      Full list of flags and other useful information

      【讨论】:

        猜你喜欢
        • 2010-11-12
        • 1970-01-01
        • 2012-01-08
        • 2010-10-18
        • 1970-01-01
        • 2016-07-22
        • 2022-07-06
        • 1970-01-01
        相关资源
        最近更新 更多