需要在正则表达式中转义的所有特殊字符的列表

Avi*_*air 93 java regex

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

为了让我的正则表达式在最大可能情况下工作和匹配,我如何获得需要转义的特殊字符的完整列表?

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

Tob*_* G. 82

  • 必须在正则表达式中转义的Java字符是:
    \.[]{}()<>*+-=!?^$|
  • 两个关闭支架(]})只需在打开相同类型的支架后进行转义即可.
  • []-brackets中,某些角色(如+-)有时会在没有逃脱的情况下工作.

  • 在`[]`中未转义的`-`可能并不总是有效,因为它用于定义范围.逃避它更安全.例如,模式`[ - ]`和`[ - )]`匹配字符串`-`但不匹配`[( - )]`. (4认同)

Sor*_*rin 81

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

如果你想要常规字符而不是特殊含义,你需要转义那里列出的任何字符.

作为一个可能更简单的解决方案,您可以将模板放在\ Q和\ E之间 - 它们之间的所有内容都被视为转义.

  • @Sorin因为Stack Exchange的精神(nay,policy?)在你的答案中陈述答案而不仅仅是链接到场外资源.此外,该页面也没有明确的清单.列表可以在这里找到:http://docs.oracle.com/javase/tutorial/essential/regex/literals.html,但它声明"在某些情况下,上面列出的特殊字符*不会被视为元字符, "如果一个人试图逃避他们,将会解释会发生什么.简而言之,这个问题应该得到一个很好的答案. (51认同)
  • 如果您发现\ Q和\ E难以记住,您可以使用Pattern.quote("...") (39认同)
  • 我希望你真的说出来了 (16认同)
  • *"它们之间的所有内容[`\ Q`和`\ E`]被视为已转义"* - 除了其他`\ Q`和'\ E`(可能在原始正则表达式中出现).因此,最好使用[`Pattern.quote`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#quote-java.lang.String- )如[建议](http://stackoverflow.com/a/372​​16573/1421194)建议,而不是重新发明轮子. (7认同)

mad*_*adx 24

要逃避,你可以从Java 1.5中使用它:

Pattern.quote("$test");
Run Code Online (Sandbox Code Playgroud)

你会匹配这个词 $test


Boh*_*dan 15

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

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

将代码列入代码中的某个位置也很酷,但我不知道那可能是哪个...

  • `字符串转义 = tnk.replaceAll("[\\&lt;\\(\\[\\{\\\\\\^\\-\\=\\$\\!\\|\\]\\} \\)\\?\\*\\+\\.\\&gt;]", "\\\\$0");` (11认同)
  • Pattern javadoc 表示在任何不表示转义结构的字母字符之前使用反斜杠是错误的,**但是**可以在非字母字符之前使用反斜杠,无论该字符是否是一个未转义的构造。因此,一个更简单的正则表达式就足够了: `s.replaceAll("[\\W]", "\\\\$0")` 其中 `\W` 指定非单词字符。 (2认同)

poc*_*sar 6

虽然答案是针对 Java 的,但代码可以轻松地从我想出的这个 Kotlin 字符串扩展中改编(改编自 @brcolow 提供的):

private val escapeChars = charArrayOf(
    '<',
    '(',
    '[',
    '{',
    '\\',
    '^',
    '-',
    '=',
    '$',
    '!',
    '|',
    ']',
    '}',
    ')',
    '?',
    '*',
    '+',
    '.',
    '>'
)

fun String.escapePattern(): String {
    return this.fold("") {
      acc, chr ->
        acc + if (escapeChars.contains(chr)) "\\$chr" else "$chr"
    }
}

fun main() {
    println("(.*)".escapePattern())
}
Run Code Online (Sandbox Code Playgroud)

印刷\(\.\*\)

在这里检查它的实际情况https://pl.kotl.in/h-3mXZkNE


小智 5

关于@ Sorin对Java Pattern文档的建议,看起来像要逃脱的字符至少是:

\.[{(*+?^$|
Run Code Online (Sandbox Code Playgroud)

  • `字符串转义 = regexString.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", " \\\\$1");` (4认同)
  • `)`也必须被转义,并且根据你是在字符类的内部还是外部,可以有更多的字符可以逃脱,在这种情况下,`Pattern.quote`在转义字符串以便使用时做得非常好字符类的内部和外部. (2认同)

Neu*_*uck 5

结合每个人的说法,我提出以下建议,以使RegExp的特殊字符列表清楚地列在自己的String中,并避免尝试直观地解析成千上万个“ \”。这对我来说似乎很好:

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");
}
Run Code Online (Sandbox Code Playgroud)