当我尝试:
Pattern p = Pattern.compile("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
我的程序出错了。为什么不喜欢这样?
[
此正则表达式无法编译,因为在 Java 中,]
当您在字符类中使用方括号时,您需要转义方括号:
Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");
^^^^^^
需要双重转义\\
,因为在 Java 字符串中使用斜杠\
来转义特殊序列,如\n
, \r
... 等
现在,当我们需要一个用于转义内容的 Java 字符串时,我们如何在 Java 字符串中包含一个文字斜线?
我们使用它 self 转义它,因此输入了两次\\
。
为什么我们需要转义[
和]
进入字符类?
因为Java支持字符类减法、交集和并集,例如:
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]] d, e, or f (intersection)
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)
示例取自文档。
您需要转义特殊字符,例如 [, ], +, (, ) 等。我不是 100% 确定,但您可以使用 \Q 和 \E 告诉正则表达式将特殊字符视为文字。
例如:
Pattern p = Pattern.compile("[\\Q,.s;:{}/[]<>?`~!@#$%^&*()_+=\\E]");
请参阅javadoc中的引用部分
如前所述,您必须跳过特殊字符......为了做到这一点,我建议您使用该Pattern.quote
方法(请参阅此处作为参考)。
String s = Pattern.quote("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
Pattern p = Pattern.compile(s);
这是正确的正则表达式:
Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");
你需要逃离[
和]
或者这也将起作用:
Pattern p = Pattern.compile("[],.s;:{}/\\[<>?`~!@#$%^&*()_+=]");
只[
需要转义即可。
]
如果它在字符类中的第一个位置,可以避免转义。