以下代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Create a Pattern object
Pattern r = Pattern.compile("[?:!.,;'’\"“”«»<>=()_-]+");
// Now create matcher object.
Matcher m = r.matcher("Hello,World!");
while(m.find())
System.out.println(m.group());
}
}
输出:
,
!
如果我在正则表达式中添加标点符号 - (较长的连字符),则它会变成:
Pattern r = Pattern.compile("[?:!.,;'’\"“”«»<>=()_-–]+");
输出变为:
ello,
orld!
有人能告诉我为什么会出现这种奇怪的故障吗?
最佳答案
这是因为 _
和 –
之间的破折号 (-
) 创建了一个范围,并包含 Unicode 代码点在 之间的所有字符_
和 –
。
_
是 U+005F–
是 U+2013
因此,介于两者之间的所有内容都包含在该范围内。这包括小写拉丁字符(范围从 U+0061 到 U+007A)。
大写拉丁字符的范围是从 U+0041 到 U+005A,因此位于 U+005F 下划线之前。这些被排除在字符类之外。
将破折号放在字符类的开头或结尾即可解决问题。
[?:!.,;'’\"“”«»<>=()_–-]+
或者,您可以使用反斜杠来转义它,但我建议您坚持使用第一个/最后一个规则,因为它更容易阅读。
关于java - 检测正则表达式中的特定标点符号的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158651/