代码之家  ›  专栏  ›  技术社区  ›  paul

这个正则表达式在cucumber中失败,但传入了正则表达式工具

  •  0
  • paul  · 技术社区  · 5 年前

    我正在尝试创建一个应用程序,该应用程序将消息模板与用户尝试发送的消息相匹配。我使用Java正则表达式来匹配消息。模板/消息可能包含特殊字符。

    如何获得需要转义的特殊字符的完整列表,以便在最大可能的情况下使regex工作并匹配?

    在Java正则表达式中是否有一个通用的解决所有特殊字符的方法?

    0 回复  |  直到 5 年前
        1
  •  77
  •   azro    6 年前

    您可以查看模式类的JavaDoc: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

    如果您想要常规字符而不是特殊含义,则需要转义此处列出的任何字符。

    作为一种更简单的解决方案,可以将模板放在\q和\e之间——它们之间的所有东西都被认为是转义的。

        2
  •  74
  •   Tobi G.    5 年前
    • 必须在正则表达式中转义的Java字符是:
      \.[]{}()<>*+-=!?^$|
    • 两个右括号( ] } )只需要在打开相同类型的括号后转义。
    • [] -将一些字符括起来(如 + - )有时工作时不要逃避。
        3
  •  21
  •   madx    8 年前

    为了逃避你可以用这个 Java 1.5 :

    Pattern.quote("$test");
    

    你将准确地匹配这个词 $test

        4
  •  15
  •   Bohdan    8 年前

    根据 String Literals / Metacharacters 文档页,它们是:

    <([{\^-=$!|]})?*+.>

    另外,在代码中的某个地方引用这个列表也是很酷的,但是我不知道在哪里…

        5
  •  5
  •   pete    10 年前

    在@ Sorin提出的Java模式文档的建议中,它看起来像是要逃离的字符至少:

    \.[{(*+?^$|
    
        6
  •  4
  •   NeuroDuck    7 年前

    结合大家所说的,我建议如下,将regexp特有的字符列表清晰地列在自己的字符串中,并避免试图从视觉上解析成千上万个“\\”字符。这对我来说似乎非常有效:

    final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
    final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
    final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");
    
    String quoteRegExSpecialChars( String s)
    {
        Matcher m = reCharsREP.matcher( s);
        return m.replaceAll( "\\\\$0");
    }
    
        7
  •  2
  •   Bo6Bear    12 年前

    另一方面,如果应用程序上下文中的特殊字符=allchars-number-abc-space,则应该使用类似这样的“non-char”正则表达式。

    String regepx = "[^\\s\\w]*";
    
        8
  •  0
  •   Ahmed Ashour chim    6 年前

    我不太明白你的问题,但我想你应该看看 Matcher.quoteReplacement()