2016-04-27 97 views
0

我正在写一个CSV解析器,并为了检测我可以期望获得的文件的不同数据类型,我有一个每个数据类型的地图,每个包含正则表达式我将其定义为有效且可识别的。例如,对于我的整数值,这里是我的地图:正则表达式效率使用交替与单个正则表达式

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$", "##0"); 
integerFormatRegexps.put("^-[1-9]\\d{1,9}$", "-##0"); 
integerFormatRegexps.put("^0$", "0"); 

现在,我已经见过几个examples这里,所以这里的而不是这些正则表达式分离,他们使用的交替,在那里,而不是三个正则表达式,我可以只使用一个:

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$", "Integer"); 

我的问题是这两种方法的将是一般更有效,在Java的匹配模式是什么时候?迭代通过单独的简单正则表达式来查找匹配项,还是仅匹配一个更复杂的正则表达式?

+3

什么阻止你自己对两个变体进行基准测试? –

+1

这是[Perl的类似问题](http://stackoverflow.com/questions/36420517/is-it-faster-to-use-alternation-than-subsequent-replacements-in-regular-expressi)。 *总结*:**请记住,你正在比较苹果和橙子**。 –

+0

@Lashane来自SO的其他职位(包括Wiktor引用的职位,这似乎是一个非常具体的话题,而且需要很多经验,实际上我可以自己衡量它,但是我应该怎么衡量呢?非常具体,因为我试图提供一个例子,但它是一个普遍的问题,正如其名称所暗示的那样:在java正则表达式匹配中将使用交替命中性能吗? – carlossierra

回答

1

首先,我不得不说,效率不太可能成为您的问题。你的正则表达式相对简单,并且在解压缩之后,你似乎正在使用它们来隔离值。

也就是说,需要注意的是,不同的分支可以匹配相同的字符。最好的例子是(.|\s),有时由尚不知道DOTALL /单行模式(或[\S\s],如this question)的正则表达式初学者使用。把它放在另一个良性的正则表达式的中间,用它来搜索一个不是特别大的文本,然后看你的计算机变得紧张。

但是,您的示例正则表达式很好,因为每个分支必须以不同的东西开头([1-9],-0)。但正如我所说的,我认为正则表达式的效率不会是一个问题。做你认为更方便的事情;是更紧凑的代码和更少数量的正则表达式对于更大,更难维护的正则表达式是合理的权衡?

还有一件事:如果您在紧密循环中反复使用正则表达式,请务必使用缓存的Pattern对象;编译它们的成本很高。实际上,考虑将它们存储在Map中作为模式而不是字符串。例如:

Pattern integerRegex = Pattern.compiile("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$"); 

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put(integerRegex, "Integer"); 

然后您可以使用静态的Pattern.matches()方法来执行检查。

+0

您能否分享一些关于答案的最后部分的示例代码? – carlossierra