我有这个正则表达式"((\\-)?[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毫秒的时间。

有任何想法吗?

最佳答案

首先,您需要修复正则表达式:

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

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

之后,您可以首先尝试查找任何字符,如果找到了,请不要与正则表达式进行检查,也不要像别人之前所说的那样将其拆分成较小的部分。

10-07 13:23