【问题标题】:Removing literal character in regex删除正则表达式中的文字字符
【发布时间】:2011-03-15 15:30:33
【问题描述】:

我有以下字符串

\Qpipe,name=office1\E

我正在使用不支持\Q\E 的简化正则表达式库。

我尝试删除它们

 s.replaceAll("\\Q", "").replaceAll("\\E", "")

但是,我收到错误 Caused by: java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 1 \E ^

有什么想法吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    \ 是 Java 字符串和正则表达式引擎中的特殊转义字符。要将文字 \ 传递给正则表达式引擎,您需要在 Java 字符串中包含 \\\\。所以试试:

    s.replaceAll("\\\\Q", "").replaceAll("\\\\E", "")
    

    另外一种更简单的方法是使用replace 方法,该方法采用字符串而不是正则表达式:

    s.replace("\\Q", "").replace("\\E", "")
    

    【讨论】:

      【解决方案2】:

      例如,使用 Pattern.quote() 函数转义正则表达式中的特殊字符

      s.replaceAll(Pattern.quote("\Q"), "")
      

      【讨论】:

        【解决方案3】:

        replaceAll 采用正则表达式字符串。相反,只需使用带有文字字符串的replace。所以myRegexString.replace("\\Q", "").replace("\\E", "")

        但这仍然给您留下了为简化的正则表达式库引用特殊正则表达式字符的问题。

        【讨论】:

          【解决方案4】:

          String.replaceAll() 将正则表达式作为参数,因此您需要将反斜杠转义两次:

          s.replaceAll("\\\Q", "").replaceAll("\\\\E", "");
          

          【讨论】:

            【解决方案5】:

            您也可以使用以下内容。我使用它是因为我正在匹配和替换一个包装的文本,并且 Q & E 将保留在模式中。这样就不行了。

            final int flags = Pattern.LITERAL;
            regex = "My regex";
            pattern = Pattern.compile( regex, flags );
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-07
              • 2016-05-26
              • 1970-01-01
              • 2014-11-07
              • 1970-01-01
              • 2011-06-28
              • 1970-01-01
              相关资源
              最近更新 更多