正则表达式评估匹配不正确

时间:2015-07-05 04:07:19

标签: 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

2 个答案:

答案 0 :(得分:2)

在你的NUMBER正则表达式中,你有.匹配任何字符,最后也是一个逗号,你需要将它转义\.,但在Java字符串中\必须是转义,因此在字符串中为"\\."

答案 1 :(得分:2)

您的正则表达式可以重构为更短的内容:

import java.util.Random;

public class RandomNumbers {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    Random rand = new Random ();
    int randCount = 3, randNum = 0, total = 0;

    for(int i =0; i < randCount; i++) {
        randNum = rand.nextInt(50);
        System.out.println(randNum);
        total = total + randNum;
    }

    int average = total/randCount;
    System.out.println(average);
}
}

这仍然符合您的要求,如下所示:

RegEx Demo

您将获得匹配组中的所有数字。

我建议您将此正则表达式与^([+-]?(?:\.\d+|\d+(?:\.\d+)?)(?:[Ee][+-]?\d+)?)(?: *, *([+-]?(?:\.\d+|\d+(?:\.\d+)?)(?:[Ee][+-]?\d+)?))*$ Pattern API一起使用,以避免再次编译这个长正则表达式&amp;再次在Matcher