我有这个正则表达式"((\\-)?[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 :(得分:3)
我怀疑如果将上面的内容拆分成一系列数字(通过拆分空格),然后将更简单的正则表达式应用于每个子字符串,我会怀疑 更快。
答案 1 :(得分:1)
首先你需要修复你的正则表达式:
"((\\-)?[0-9]+(\\.([0-9])+)? )+"
因为您的版本匹配两个数字之间的任何符号,包括空格。也许这会降低性能。
之后你可以先尝试找到任何一个角色,如果找到,不要检查你的正则表达式,或者像以前有人说的那样分成小块。