java - 正则表达式错误地评估匹配

标签 java regex

我在使用 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/

相关文章:

java - java中使用amf3input反序列化amf二进制格式

java - 在树莓派中添加JDBC驱动

javascript - 如何编写一个 javascript 正则表达式来用 html 超链接替换这种格式 [*](*) 的超链接?

java - 字典数据结构+快速复杂度方法

java - 转换或方法调用哪个更有效/更便宜?

Java - 如何对多个 JTextFields 使用单个 FocusListener?

不允许以 2 * 开头的正则表达式

javascript - 更改正则表达式

C# 正则表达式验证程序验证

python - 将正则表达式应用于 pandas 数据框列