正则表达式,ANTLR或任何其他解决方案?

时间:2012-04-08 20:10:40

标签: java regex parsing antlr lexer

现在这个对我来说是一个很大的挑战。

我在一个文件中有大约1000个查询,所有类似的模式都是:

***\*XYZ#PQR#\****

现在,#表示任意数量的非空白字符 我已经编写了一个可以读取上述行并生成相应正则表达式的文章 但是,大约有100,000名候选人,正如我提到的那样,大约有1000个这样的问题需要对比赛进行评估 这使我的代码在计算上非常昂贵,因为它的顺序为m * n。

我一直在通过ANTLR,我发现学习曲线非常陡峭。虽然听起来很有希望,但如果可以通过Antlr实现这一点,我仍然怀疑在我的脑海中。请让我知道您的意见或任何其他可行的解决方案。

3 个答案:

答案 0 :(得分:2)

在我看来,你有数千个单独的正则表达式,r1,r2,... r1000,它们识别结果A,B,C的一些固定集合(远小于单个正则表达式的数量) ,...

在那种情况下,你可以在逻辑上将正则表达式a1,a2,... a用于结果A,将b1,... bm用于结果B.(能够分离组合正则表达式并获得正则表达式是一个众所周知的正则表达式的理论属性)。

大多数表达正则表达式的系统(可能不是你的)允许你把它写成

 a1 | a2 | .. | an --> A

或一些等效的语法。这样的系统通常与所谓的lexer generators相关联,这允许编译器编写者在字符方面表达令牌的细粒度语法。

这些工具的一个很大的优点是,匹配(所有正则表达式)标记的努力通常是关于正则表达式数量的次线性,通过计算有限的 - 状态机,其中由一些正则表达式共享的前缀仅被识别一次。这可能意味着巨大的加速并直接应用于您的情况。

广泛使用的工具FLEX非常有效地完成了这项工作。 ANTLR有一种机制来识别表达为正则表达式的标记,但我不知道它是否生成有效的有限状态匹配器。

答案 1 :(得分:1)

完成它。 使用正则表达式,花了一个小时, 使用Lucene,WildCardQueries和booleanQuery来处理排列,在11分钟内完成工作。 *祝愿如果有人可以在一周内学习Flex的时间表。 但Lucene是大型DataSet,Regex和Crunching的理想选择。 它可能并不总能解决您的问题,但它只是另一种解决方案。

答案 2 :(得分:0)

我认为在ANTLR中没有必要,因为可以进行简单的字符串查找和替换:# - > \\.*。应删除星号。

因此,对于*Telecom#Servic#*,您获得了Telecom\\.*Servic\\.*。您还可以添加$和^来检查字符串的开头/结尾。