Java正则表达式-转义所有特殊的正则表达式字符

时间:2018-10-30 19:12:26

标签: java regex special-characters

我确实有很多带有特殊正则表达式字符的字符串。例子:

- Test1 + Test2 -> plus should not be a regex special character but a normal character

是否存在Java正则表达式方法来转义所有正则表达式特殊字符?

3 个答案:

答案 0 :(得分:2)

注释更好地手动转义的建议通常是正确的-但是,如果您输入的字符串是“未知”,例如用户可以输入的字符串,则不能执行此操作。因此,假设您的字符串是一个变量,则您最有可能寻找Pattern.quotehttps://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)

这是如何转义所有正则表达式元字符的方法。

背景:

  1. 如果需要将某些输入或动态源转换为正则表达式,请放心
    它是%100个文字。

  2. 如果您具有 MIX 的正则表达式构造 和通过元字符使用正则表达式构造的文字,则使用
  3. \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