我在使用 Java 风格的正则表达式来正确评估匹配时遇到问题。我定义了以下正则表达式:
//Any digit
static String NUM = "[0-9]";
//Exponent with only 3 digits specified
static String EXPONENT = "([Ee][+-]?" + NUM + "(" + NUM + "(" + NUM + ")?)?)";
static String NUMBER = "([+-]?((" + NUM + NUM + "*.?" + NUM + "*)|(." + NUM
+ NUM + "*))" + EXPONENT + "?)";
static String S_COMMA_S = "(( )*,( )*)";
static String NUM_DATA = "(" + NUMBER + "(" + S_COMMA_S + NUMBER + ")*)";
根据 NUM_DATA 的定义方式,可能的匹配将是“123, 456” 据我的理解,任何以数字而不是逗号结尾的数字列表都应该有效。但是根据下面的测试方法,匹配的是一个以逗号结尾的数字列表
public static void main(String[] args) {
System.out.println(NUM_DATA);
String s = "123";
System.out.println(s.matches(NUM_DATA));
s = "123, 456";
System.out.println(s.matches(NUM_DATA));
s = "123, 456,";//HANGING COMMA, SHOULD NOT MATCH
System.out.println(s.matches(NUM_DATA));
}
这会产生以下输出:
(([+-]?(([0-9][0-9]*.?[0-9]*)|(.[0-9][0-9]*))([Ee][+-]?[0-9]([0-9]([0-9])?)?)?)((( )*,( )*)([+-]?(([0-9][0-9]*.?[0-9]*)|(.[0-9][0-9]*))([Ee][+-]?[0-9]([0-9]([0-9])?)?)?))*)
true
true
true
我的假设哪里出了问题?还是这种行为不正确?
编辑:我想我应该发布我期望的行为
Matches: (Any list of comma separated numbers, including one number)
1.222
1.222, 324.4
2.51e123, 3e2
-.123e-12, 32.1231, 1e1, .111, -1e-1
Non-Matches:
123.321,
,
, 123.321
最佳答案
在你的NUMBER正则表达式中,你有一个.
,它匹配任何字符,最后还有一个逗号,你需要转义它\.
,但在Java字符串中\
必须转义,因此它是字符串中的 "\\."
。
关于java - 正则表达式错误地评估匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227052/