0

当我尝试:

Pattern p = Pattern.compile("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");

我的程序出错了。为什么不喜欢这样?

4

4 回答 4

3

[此正则表达式无法编译,因为在 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)

示例取自文档。

于 2013-11-06T16:34:52.797 回答
2

您需要转义特殊字符,例如 [, ], +, (, ) 等。我不是 100% 确定,但您可以使用 \Q 和 \E 告诉正则表达式将特殊字符视为文字。

例如:

Pattern p = Pattern.compile("[\\Q,.s;:{}/[]<>?`~!@#$%^&*()_+=\\E]");

请参阅javadoc中的引用部分

于 2013-11-06T16:38:28.237 回答
0

如前所述,您必须跳过特殊字符......为了做到这一点,我建议您使用该Pattern.quote方法(请参阅此处作为参考)。

String s = Pattern.quote("[,.s;:{}/[]<>?`~!@#$%^&*()_+=]");
Pattern p = Pattern.compile(s);
于 2013-11-06T16:44:46.570 回答
0

这是正确的正则表达式:

Pattern p = Pattern.compile("[,.s;:{}/\\[\\]<>?`~!@#$%^&*()_+=]");

你需要逃离[]

或者这也将起作用:

Pattern p = Pattern.compile("[],.s;:{}/\\[<>?`~!@#$%^&*()_+=]");

[需要转义即可。

]如果它在字符类中的第一个位置,可以避免转义。

于 2013-11-06T16:35:32.687 回答