3

我有这个正则表达式"((\\-)?[0-9]+(.([0-9])+)? )+",它应该匹配由单个空格分隔的数字序列。例如“5 4 1 2 2.4 3 7.8”或“5 4 1 2 2.4 8.001 7.8”。

为了检查字符串是否与我做的正则表达式匹配:

if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)? )+")){
    // anything
}

问题是,当我像上面的例子一样给出这个小字符串时,它很完美。但是对于较长的字符串,例如:“2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000”,如果匹配则完美,但如果不匹配则最多需要 5 秒。检查这个:

String value = "2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000 h";

System.out.println("Start: "+System.currentTimeMillis());
if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)? )+")){
    System.out.println("OK");
}else{
    System.out.println("NOK");
}
System.out.println("End: "+System.currentTimeMillis());

这需要长达 5 秒!而如果您从字符串末尾删除“h”,则需要不到 1 毫秒。

有任何想法吗?

4

2 回答 2

3

我怀疑如果将上述内容拆分为一系列数字(通过在空格上拆分),然后将更简单的正则表达式应用于每个子字符串,您将获得更快的性能

于 2012-11-27T10:36:42.087 回答
1

首先你需要修复你的正则表达式:

"((\\-)?[0-9]+(\\.([0-9])+)? )+"

因为您的版本匹配两个数字之间的任何符号,包括空格。也许这会降低性能。

之后,您可以先尝试查找任何字符,如果找到,请不要检查您的正则表达式或像之前所说的那样拆分成更小的部分。

于 2012-11-27T10:40:08.643 回答