我确实有很多带有特殊正则表达式字符的字符串。例子:
- Test1 + Test2 -> plus should not be a regex special character but a normal character
是否存在Java正则表达式方法来转义所有正则表达式特殊字符?
答案 0 :(得分:2)
注释更好地手动转义的建议通常是正确的-但是,如果您输入的字符串是“未知”,例如用户可以输入的字符串,则不能执行此操作。因此,假设您的字符串是一个变量,则您最有可能寻找Pattern.quote
:
https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)
String variableFromSomewhere="- Test1 + Test2";
String escapedString = Pattern.quote(variableFromSomewhere);
(除了使用\Q
和\E
以外,其他操作无济于事,但是如果\Q
和\E
是输入字符串的一部分,则键入时所需的精力更少,并且避免了问题本身。)
答案 1 :(得分:1)
要转义单个特殊字符,可以使用\\
boolean b = Pattern.matches("\\- .* \\+ .*", "- Test + Test"); // true
答案 2 :(得分:0)
这是如何转义所有正则表达式元字符的方法。
背景:
如果需要将某些输入或动态源转换为正则表达式,请放心
它是%100个文字。
\Q .. \E
。
示例:(?:\Q(?:dogs|cats)*\E)+
这将匹配一个或多个文字(?:dogs|cats)*
\Q .. \E
还有其他问题,例如嵌套和解释
最终结果逃脱了正则表达式。调试变得非常困难。
因此,最简单,最安全的方法就是只使用String.replaceAll()
。
Java示例:
String src = "he,<>!!llo \\ + * ? [ ] ( ) { } | . ^ $ wo-r@l#d";
System.out.println( src );
src = src.replaceAll("([\\\\+*?\\[\\](){}|.^$])", "\\\\$1");
System.out.println( src );
输出:
he,<>!!llo \ + * ? [ ] ( ) { } | . ^ $ wo-r@l#d
he,<>!!llo \\ \+ \* \? \[ \] \( \) \{ \} \| \. \^ \$ wo-r@l#d