【问题标题】:Escape ( in regular expression转义(在正则表达式中
【发布时间】:2013-12-19 08:56:50
【问题描述】:

我正在搜索正则表达式 - ".(conflicted copy."。我为此编写了以下代码

String str = "12B - (conflicted copy 2013-11-16-11-07-12)";
boolean matches = str.matches(".*(conflicted.*");
System.out.println(matches);

但我得到了例外

线程“main”中的异常 java.util.regex.PatternSyntaxException:索引 15 附近的未关闭组 .(有冲突。

我了解编译器认为( 是模式组的开始。我试图通过添加\( 来逃避(,但这不起作用。

谁能告诉我如何在这里逃脱(

【问题讨论】:

    标签: java regex


    【解决方案1】:

    转义由\ 完成。在 Java 中,\ 写为 \\1,因此您应该将 ( 转义为 \\(

    旁注:最好看看Pattern#quote,它返回一个文字模式字符串。在您的情况下,它并没有太大帮助,因为您不想逃避所有 special-characters


    1 因为a character preceded by a backslash (\) is an escape sequence and has special meaning to the compiler

    【讨论】:

    • 谢谢。这行得通!但是你能告诉我为什么它是 \\ 当它是 \ 用于转义其他字符,如 "
    【解决方案2】:

    正则表达式中的( 是元字符,表示“组的开始”,需要用) 关闭。如果您希望 refex 引擎将其视为简单文字,则需要对其进行转义。您可以通过在其前面添加\ 来做到这一点,但由于\ 也是String 中的元字符(例如用于创建"\n""\t" 等字符),您还需要对其进行转义,看起来像@ 987654327@。所以试试

    str.matches(".*\\(conflicted.*"); 
    

    其他选项是使用字符类来转义(

    str.matches(".*[(]conflicted.*"); 
    

    您也可以在需要转义的部分使用Pattern.quote(),例如

    str.matches(".*"+Pattern.quote("(")+"conflicted.*"); 
    

    或者简单地用"\\Q""\\E"将所有字符作为文字串起来的部分包围起来,代表引号的开始和结束。

    str.matches(".*\\Q(\\Econflicted.*"); 
    

    【讨论】:

      【解决方案3】:

      在正则表达式中,所有字符都可以通过在前面添加反斜杠来安全地转义。

      请记住,在包括 C#、PHP 和 Java 在内的大多数语言中,反斜杠本身也是一种原生转义,因此需要在非文字字符串中自行转义,因此要求您输入 "myText \\("

      在正则表达式中使用反斜杠可能需要您在语言级别和正则表达式级别 ("\\\\") 对其进行转义:这会将 "\\" 传递给正则表达式引擎,它会将其解析为 "\" 本身。

      【讨论】:

        猜你喜欢
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多