java - 理解 Java 中的正则表达式

标签 java regex

我的程序按我希望的方式运行,但我偶然发现了一些我不理解的东西。

String problem = "4 - 2";
problem = problem.replaceAll("[^-?+?0-9]+", " ");
System.out.println(Arrays.asList(problem.trim().split(" ")));

打印 [4, -, 2]

但是

String problem = "4 - 2";
problem = problem.replaceAll("[^+?-?0-9]+", " ");
System.out.println(Arrays.asList(problem.trim().split(" ")));

甚至不对减号做任何事情并打印 [4, 2]

为什么这样做,看起来两者都应该有效。

最佳答案

连字符在字符类中有特殊含义:它用于定义字符范围(如 a-z0-9),但以下情况除外:

  • 在字符类的开头或紧跟在否定字符^
  • 之后
  • 用反斜杠转义
  • 在字符类的末尾
  • 在像 \w\s\d\这样的简写字符类之后使用一些正则表达式引擎p{thing},... (对于这些,情况没有歧义,不能是范围)

在第一个示例中,它被视为文字连字符(因为它位于开头)。

在您的第二个示例中,我假设 ?-? 定义了 ?? 之间的范围(仅此而已比字符 ?)

注意:?在字符类中没有特殊含义(它不再是量词而是简单的文字字符)

关于java - 理解 Java 中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41335419/

相关文章:

java - 正则表达式除了第一个

java - JMX 从 kubernetes pod 转发不同端口

java - 无法运行 Maven Google 标准应用程序引擎 1.9.68 原型(prototype)

java - 如何让JOptionPane计算面积?

java - java中用空格替换回车符

php - youtube正则表达式会吞下剩余的文字

regex - 删除多个带有条件的 <br> 标签实例

java - 使用java通过usb/RS232转换器发送数据

java - 如何比较 mySQL 中的日期与 java 中的当前日期?

javascript - 我将如何匹配 `.scss` 、 `.sass` 、 `.css` 但不匹配 `.ass` ? (正则表达式)