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

时间:2013-01-03 07:14:11

标签: java regex

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

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

是否有一个通用的解决方案可以转义Java正则表达式中的所有特殊字符?

10 个答案:

答案 0 :(得分:77)

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

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

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

答案 1 :(得分:75)

  • 必须在正则表达式中转义的Java字符是:
    \.[]{}()<>*+-=!?^$|
  • 关闭括号中的两个(]})只需在打开相同类型的括号后进行转义。
  • [] - 括号中,某些字符(例如+-)有时无法逃脱。

答案 2 :(得分:22)

要逃避,您可以使用Java 1.5

Pattern.quote("$test");

您将匹配单词$test

答案 3 :(得分:15)

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

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

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

答案 4 :(得分:5)

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

\.[{(*+?^$|

答案 5 :(得分:4)

结合大家所说的,我提出以下建议,保持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");
}

答案 6 :(得分:2)

在硬币的另一面,你应该使用看起来像这样的“非char”正则表达式,如果你的应用程序上下文中有特殊字符= allChars - number - ABC - space。

String regepx = "[^\\s\\w]*";

答案 7 :(得分:2)

尽管答案是针对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())
}

打印\(\.\*\)

此处https://pl.kotl.in/h-3mXZkNE

对其进行操作

答案 8 :(得分:1)

Pattern.quote(String s)可以满足您的需求。但是,它还有一点不足。它实际上并不会转义单个字符,而只是用\Q...\E来包装字符串。

没有一种方法可以完全满足您的需求,但是好消息是,实际上转义Java正则表达式中的所有特殊字符非常简单:

regex.replaceAll("[\\W]", "\\\\$0")

为什么这样做?好吧,Pattern的文档特别指出,它可以转义不一定要转义的非字母字符:

  

在任何不表示转义结构的字母字符之前使用反斜杠是一个错误;这些保留用于将来对正则表达式语言的扩展。 在非字母字符之前可以使用反斜杠,而不管该字符是否属于未转义的构造。

例如,;在正则表达式中不是特殊字符。但是,如果您将其转义,Pattern仍会将\;解释为;。这里还有更多示例:

  • >变成\>,相当于>
  • [成为\[的{​​{1}}
  • [仍然是8
  • 8变成\),是\\\)\的转义形式。

注意:关键是“非字母”的定义,它在文档中实际上表示“ non- 单词”字符或该字符之外的字符设置(

答案 9 :(得分:1)

假设您拥有并信任(权威)Java regex使用的转义字符列表(如果这些字符在某些Pattern类成员中公开,那将是很好的选择),可以使用以下方法来转义该字符:确实有必要:

private static final char[] escapeChars = { '<', '(', '[', '{', '\\', '^', '-', '=', '$', '!', '|', ']', '}', ')', '?', '*', '+', '.', '>' };

private static String regexEscape(char character) {
    for (char escapeChar : escapeChars) {
        if (character == escapeChar) {
            return "\\" + character;
        }
    }
    return String.valueOf(character);
}