2012-11-27 52 views
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 ms。

任何想法?

+4

另外我想你可能想逃避点'.'。 – jlordo

回答

1

首先,你需要解决您的正则表达式:

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

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

之后,你可以首先尝试找到任何字符,如果找到,不要检查你的正则表达式或分裂成更小的片断,因为有人告诉过。

+0

WOW ..就是这样:)它像一个魅力:) Thnx –

3

我怀疑你会得到太多如果你将上面的代码拆分成数字序列(通过分割空白)然后对每个子字符串应用更简单的正则表达式,性能会更快。

+0

好吧,似乎是一个聪明的解决方法,但不是一个解决方案,如果你知道我的意思:) –

相关问题