Java 正则表达式、ANTLR或任何其他解决方案?
这对我来说是一个很大的挑战 我在一个文件中有大约1000个查询,所有类似的模式如下:Java 正则表达式、ANTLR或任何其他解决方案?,java,regex,parsing,antlr,lexer,Java,Regex,Parsing,Antlr,Lexer,这对我来说是一个很大的挑战 我在一个文件中有大约1000个查询,所有类似的模式如下: ***\*XYZ#PQR#\**** 现在,其中#表示任意数量的非空白字符。 我已经编写了一段代码,可以读取上面一行中的数据并生成相应的正则表达式。 然而,大约有100000名候选人,正如我提到的,大约有1000个这样的查询需要为比赛进行评估。 这使得我的代码在计算上非常昂贵,因为它的数量级是m*n 我经历过ANTLR,我发现学习曲线相当陡峭。尽管这听起来很有希望,但我仍然怀疑使用Antlr是否可以实现这一点
***\*XYZ#PQR#\****
现在,其中#表示任意数量的非空白字符。我已经编写了一段代码,可以读取上面一行中的数据并生成相应的正则表达式。
然而,大约有100000名候选人,正如我提到的,大约有1000个这样的查询需要为比赛进行评估。
这使得我的代码在计算上非常昂贵,因为它的数量级是m*n
我经历过ANTLR,我发现学习曲线相当陡峭。尽管这听起来很有希望,但我仍然怀疑使用Antlr是否可以实现这一点。请让我知道您的意见或任何其他可行的解决方案。我认为ANTLR没有必要,因为简单的字符串查找和替换是可能的:
\
->\.
。应删除星号
所以对于
*电信#服务#*
你得到了Telecom\\\.*Servic\\.*
。您还可以添加$和^来检查字符串的开头/结尾。在我看来,您拥有数千个单独的正则表达式,r1,r2。。。r1000识别结果A、B、C……的固定集(远小于单个正则表达式的数量)
在这种情况下,您可以逻辑地组合正则表达式a1、a2、。。。结果A为A,结果b1为。。。结果B的bm(析取合成正则表达式并获得正则表达式的能力是正则表达式众所周知的理论属性)
大多数表达正则表达式的系统(可能不是你的)都允许你把它写成
a1 | a2 | .. | an --> A
或者一些等价的语法。这类系统通常与所谓的编译器关联,编译器编写者可以用字符来表示令牌的细粒度语法
这类工具的一个巨大优势是,匹配(所有正则表达式)标记的努力通常相对于正则表达式的数量是次线性的,这是通过计算有限状态机实现的,在有限状态机中,某一组正则表达式共享的前缀只被识别一次。这可能意味着巨大的加速,并直接适用于像您这样的情况
广泛使用的FLEX工具可以非常有效地实现这一点。ANTLR有某种机制来识别表示为正则表达式的标记,但我不知道它是否生成有效的有限状态匹配器。完成了。
使用正则表达式需要一个小时,
使用Lucene、WildcardQuery和booleanQuery来处理排列,工作只需11分钟。
*希望一个人能在一周内有一个学习Flex的时间表。
但是Lucene对于大型数据集、正则表达式和计算是一个很好的选择。
它可能并不总能解决您的问题,但它只是另一种解决方案。请您更详细地解释模式是什么(相同长度、不同长度等)以及您需要如何处理它们。这些模式旨在处理不同的关键字,例如,“*Telecom#Servic#*”将匹配“Telecommunication Services”。图案长度可能因关键字而异。我想识别每个变体及其对应的模式。我已经实现了相同的。然而,它变得相当昂贵。就像我说的,我有1000个这样的问题。因此,我必须对100000个候选项运行1000次。由此生成的正则表达式类似于^.*\\s+Telecom\\s*\\s+Servic\\s*\\s+.$那么目标是什么?要通过消除某些其他regexp所涵盖的regex来减少regex的数量,谢谢。但我有一个很短的时间表,通过Lucene完成了。