1

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

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

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

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

我经历过 ANTLR,发现学习曲线非常陡峭。虽然这听起来很有希望,但我仍然怀疑是否可以通过使用 Antlr 来实现。请让我知道您的意见或任何其他可行的解决方案。

4

3 回答 3

2

在我看来,您拥有数以千计的单个正则表达式,r1, r2, ... r1000,它们标识了结果 A、B、C、...的一些固定集合(远小于单个正则表达式的数量)。 .

在那种情况下,您可以将结果 A 的正则表达式 a1, a2, ... an 和结果 B 的 b1, ... bm 逻辑组合。知道正则表达式的理论性质)。

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

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

或一些等效的语法。这样的系统通常与所谓的词法分析器生成器相关联,它允许编译器编写者根据字符来表达标记的细粒度语法。

此类工具的一个巨大优势是,匹配(所有正则表达式)标记的工作通常相对于正则表达式的数量是次线性的,这可以通过计算一个有限状态机来实现,其中前缀由某些集合共享正则表达式只被识别一次。这可能意味着巨大的加速,并直接适用于您的情况。

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

于 2012-04-08T23:20:35.837 回答
1

完成它。使用 Regex,需要一个小时,使用 Lucene、WildCardQueries 和 booleanQuery 来处理排列,工作在 11 分钟内完成。*希望有人可以在一周内制定学习 Flex 的时间表。但是 Lucene 是大型数据集、Regex 和 Crunching 的不错选择。它可能并不总能解决您的问题,但它只是另一种解决方案。

于 2012-04-17T19:44:24.450 回答
0

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

所以*Telecom#Servic#*你得到了Telecom\\.*Servic\\.*. 您还可以添加 $ 和 ^ 来检查字符串的开头/结尾。

于 2012-04-08T20:25:18.010 回答