我的程序按我希望的方式运行,但我偶然发现了一些我不理解的东西。
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-z
或 0-9
),但以下情况除外:
- 在字符类的开头或紧跟在否定字符
^
之后
- 用反斜杠转义
- 在字符类的末尾
- 在像
\w
、\s
、\d
、\这样的简写字符类之后使用一些正则表达式引擎p{thing}
,... (对于这些,情况没有歧义,不能是范围)
在第一个示例中,它被视为文字连字符(因为它位于开头)。
在您的第二个示例中,我假设 ?-?
定义了 ?
和 ?
之间的范围(仅此而已比字符 ?
)
注意:?
在字符类中没有特殊含义(它不再是量词而是简单的文字字符)
关于java - 理解 Java 中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41335419/