我正在编写一个程序,需要去除相当多的垃圾信息。我使用正则表达式来实现,由于我的程序在速度方面比较敏感,我需要知道哪种解决方案更快:使用一系列连续而相对简单的正则表达式,还是使用一个相当复杂的单一正则表达式?
此致, Timofey。
我正在编写一个程序,需要去除相当多的垃圾信息。我使用正则表达式来实现,由于我的程序在速度方面比较敏感,我需要知道哪种解决方案更快:使用一系列连续而相对简单的正则表达式,还是使用一个相当复杂的单一正则表达式?
此致, Timofey。
你需要进行基准测试以确保结果,并确保博客记录下测试结果。我怀疑一个大的正则表达式比许多小的正则表达式更快,但我很想知道你的发现。
java.util.regex.Pattern
类非常复杂,我不敢保证它的优化表现如何。我知道正则表达式会编译成图形,因此显而易见的是可以将重叠路径合并。你将许多变量放入单个表达式中,就会有更多这样的机会。这也可能减少对输入数据的传递次数。
perl -Mre=debug -cwe '/abc|adec|adfe|abcdgd|adfxe/'
如何工作。Trie 比逐个测试快得多。听起来 Java 却不够聪明。 - tchrist正如你们中的许多人建议的那样,我尝试了一下,并得出了以下结果:
将我使用的一些正则表达式连续加入到一个中后,我的执行时间几乎增加了一倍(从处理1000个字符串需要10秒变为处理相同数量的字符串需要18秒)。
所以,基本上可以得出结论:顺序地尽可能多地删除符号,使剩余的字符串在下一个清理的正则表达式中尽可能短,比长正则表达式更快。
PS。不幸的是,我无法张贴正则表达式本身,因为它们会被代码高亮显示器损坏。
PPS: 这里是我依次使用的一些正则表达式:
s = s.replaceAll("<span STYLE=\"color:[\w|\d|\(|\)|\,]++\">", "");
s = s.replaceAll("</{0,1}\w++>", "");
s = s.replaceAll("<img SRC=\"/gif/", "");
s = s.replaceAll("(width|height)\s{0,}=\s{0,}\"{0,1}\d{1,}\"{0,1}", "");
s = s.replaceAll("align=\"\w++\"", "");
然后我将它们结合在一起,将每个正则表达式放在括号中,并在它们之间放置|。