java - 检测正则表达式中的特定标点符号的奇怪行为

标签 java regex encoding

以下代码:

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/

相关文章:

正则表达式不适用于 Perl 中的特定特殊字符

java - 如何读取保存编码的文件?

java - 如何退出 Java 运行时并保存当前进度?

java - X-Frame-Options 支持同一域的不同子域

javascript - 是否可以使用正则表达式向后查找匹配项?

python - 'ascii' 编解码器无法解码位置 319 : ordinal not in range(128)? 中的字节 0xef

Python UTF8 编码

java - 泛型返回类型不起作用

java - 从 servlet 打印/输出 jsp 页面

python - 正则表达式:python 其他结果作为 regexr