我无法获得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
答案 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);
}
}
这仍然符合您的要求,如下所示:
您将获得匹配组中的所有数字。
我建议您将此正则表达式与^([+-]?(?:\.\d+|\d+(?:\.\d+)?)(?:[Ee][+-]?\d+)?)(?: *, *([+-]?(?:\.\d+|\d+(?:\.\d+)?)(?:[Ee][+-]?\d+)?))*$
和Pattern
API一起使用,以避免再次编译这个长正则表达式&amp;再次在Matcher
。