我正在尝试创建一个与消息模板匹配的应用程序以及用户尝试发送的消息.我正在使用Java正则表达式来匹配消息.模板/消息可能包含特殊字符.
为了让我的正则表达式在最大可能情况下工作和匹配,我如何获得需要转义的特殊字符的完整列表?
是否有一个通用的解决方案来逃避Java正则表达式中的所有特殊字符?
Tob*_* G. 82
\.[]{}()<>*+-=!?^$|]和})只需在打开相同类型的支架后进行转义即可.[]-brackets中,某些角色(如+和-)有时会在没有逃脱的情况下工作.Sor*_*rin 81
您可以查看Pattern类的javadoc:http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
如果你想要常规字符而不是特殊含义,你需要转义那里列出的任何字符.
作为一个可能更简单的解决方案,您可以将模板放在\ Q和\ E之间 - 它们之间的所有内容都被视为转义.
mad*_*adx 24
要逃避,你可以从Java 1.5中使用它:
Pattern.quote("$test");
Run Code Online (Sandbox Code Playgroud)
你会匹配这个词 $test
Boh*_*dan 15
根据String Literals/Metacharacters文档页面,它们是:
<([{\^-=$!|]})?*+.>
将代码列入代码中的某个位置也很酷,但我不知道那可能是哪个...
虽然答案是针对 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)
结合每个人的说法,我提出以下建议,以使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)