我正在尝试创建一个与消息模板匹配的应用程序,以及用户尝试发送的消息。我正在使用Java正则表达式来匹配消息。模板/消息可能包含特殊字符。
我如何获得需要转义的特殊字符的完整列表,以便我的正则表达式在最大可能情况下工作和匹配?
是否有一个通用的解决方案可以转义Java正则表达式中的所有特殊字符?
答案 0 :(得分:77)
您可以查看Pattern类的javadoc:http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
如果你想要常规字符而不是特殊含义,你需要转义那里列出的任何字符。
作为一个更简单的解决方案,您可以将模板放在\ Q和\ E之间 - 它们之间的所有内容都被视为已转义。
答案 1 :(得分:75)
\.[]{}()<>*+-=!?^$|
]
和}
)只需在打开相同类型的括号后进行转义。[]
- 括号中,某些字符(例如+
和-
)有时无法逃脱。答案 2 :(得分:22)
答案 3 :(得分:15)
答案 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)
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())
}
打印\(\.\*\)
答案 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);
}