2011-08-11 28 views
0

我正在使用Java/Groovy通过RegEx在字符串上查找匹配(并将它们提取出来)。在字符串中找到200个或更多正则表达式匹配的最佳方式是什么,可以说性能方面是5000个字符。简而言之,是否有可能避免为每个RegEx扫描字符串?上一个字符串的数百个正则表达式

我可以使用java提供的模式和匹配器类,但然后我将不得不编译200个模式,然后将字符串传递给匹配器200次。这是做到这一点的唯一方法吗?

+1

你的图案有没有相似的图案?您可以搜索一些通用模式(例如A.A),提取子字符串,然后在更具体的模式(ABA,ACA)上匹配它吗? – Paolo

+0

这些正则表达式是什么?他们是否有序?如果没有,你必须扫描每个正则表达式的整个字符串。如果是的话,你可能会在最后一场比赛后开始。 – Thomas

+0

你使用“真正的”正则表达式还是你只是在寻找单词(全文搜索)。在后一种情况下,某些索引可能会减少运行时间。 – Jens

回答

3

如果你的正则表达式没有共同的匹配,你总是可以通过使用替代方法将它们组合在一个巨大的正则表达式中。

(regex1) | (regex2) | .... | (regexN) 

但是鉴于你的问题,我认为你应该考虑从正则表达式切换到适当的扫描仪/分析器组合的复杂性。这需要时间,但最终的解决方案将更易于管理。你为什么不退房Antlr

+0

使用正确的解析器+1。它会*让你的生活变得更容易。 – exhuma

+0

Will Antlr是否适用于松散定义的语法?例如,如果我想从一个陈述中捕捉一个人的身高,有很多方式可以表达这个事实。对于Ex:他的身高是6英尺,他是6英尺高等。我正在考虑编写正则表达式列表,它可以从大多数常见类型的句子中提取高度。此外,我不想捕捉只有一个这样的事实,有20 30更多 – Sap

+0

Antlr面向识别形式语言,所以它可能是最具体的工具,你可以找到。另一方面,你可能能够做的是隔离特定的关键字和构造,而忽略其余的。你最终可能会得到比一堆正则表达式更结构化的东西,但是需要一些工作来明确处理你不关心的东西。 –

相关问题