2012-04-08 91 views
1

现在这个对我来说是一个很大的挑战。正则表达式,ANTLR还是其他解决方案?

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

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

现在,其中#表示任何号码非空白charecters。
我已经编写了一段代码,可以读取上面的代码并生成相应的正则表达式。
但是,大约有100,000名候选人,并且我提到了大约1000个这样的查询,以便对比赛进行评估。
这使得我的代码在计算上相当昂贵,因为它要达到m * n的数量级。

我已经经历了ANTLR,我发现学习曲线非常陡峭。虽然听起来很有希望,但在我脑海中的某个角落,如果可以通过使用Antlr实现,我仍然存在疑问。请让我知道您的意见或任何其他可行的解决方案。

+1

能否请您详细解释一下哪些图案(长度相同,长度不同等),以及您需要怎样处理它们。 – 2012-04-08 20:13:38

+0

这些模式旨在处理各种关键字,如'* * Telecom#Servic#\ *'将匹配'电信服务'。模式长度可以根据关键字而变化。我想识别每个变体及其相应的模式。 – 2012-04-08 20:15:42

回答

1

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

0

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

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

+0

我已经实现了。但是,它变得相当昂贵。就像我说的,我有1000个这样的查询。因此,我必须通过1000次候选人才能完成1000次。 – 2012-04-08 20:29:07

+0

这样生成的正则表达式就像^。* \\ s + Telecom \\ S * \\ s + Servic \\ S * \\ s +。* $ – 2012-04-08 20:48:13

+0

那么,目标是什么?通过消除某些其他正则表达式覆盖的正则表达式来减少正则表达式的数量? – 2012-04-08 21:34:46

2

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

在这种情况下,您可以在逻辑上组合结果A的正则表达式a1,a2,... an和结果B的b1,... bm。(分离组合正则表达式和正则表达式是正则表达式的一个公认的理论特性)。

表达正则表达式的大多数系统(也许不是你的)允许你写为

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

或某些等效语法。这样的系统通常与所谓的lexer generators有关,它们允许编译器编写者用字符表示令牌的精细语法语法。

这种工具一大优点是,为了匹配(所有的正则表达式)的标记通常是通过计算有限状态机次线性相对于正则表达式的数量,成为可能,其中由一组正则表达式共享的前缀仅被识别一次。这可能意味着巨大的加速并直接适用于诸如您的情况。

广泛使用的工具FLEX可以非常有效地完成这项工作。 ANTLR具有某种用于识别表示为正则表达式的令牌的机制,但我不知道它是否会生成有效的有限状态匹配器。

+0

谢谢。但我有一个非常短的时间线,并通过Lucene完成。 – 2012-04-17 19:46:04