如何快速匹配长字符串与正则表达式?

时间:2012-11-27 10:33:37

标签: java regex

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我怀疑如果将上面的内容拆分成一系列数字(通过拆分空格),然后将更简单的正则表达式应用于每个子字符串,我会怀疑 更快。

答案 1 :(得分:1)

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

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

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

之后你可以先尝试找到任何一个角色,如果找到,不要检查你的正则表达式,或者像以前有人说的那样分成小块。