我有一个无限的字符串序列和许多按优先级排序的正则表达式。对于序列中的每个字符串,我必须找到第一个匹配的正则表达式和匹配的子字符串。字符串不是很长(<1Kb),而正则表达式的数量可能从数百到数千不等。
我正在寻找能够有效完成这项工作的Java工具。我想这项技术应该是提前建立DFA。
我目前的选择是JFLEX。我在JFLEX中无法解决的问题是它的规则没有优先级,JFLEX查找匹配文本最长部分的规则。
我的问题是我的问题是否可以通过JFLEX解决?如果没有,你能建议另一种Java工具/技术吗?
答案 0 :(得分:3)
您可以使用Java regexp。将备选方案构建为RE字符串,每个备选方案都包含'('和')+?'并以'|'分隔,优先级最高的RE首先。第一个构造使子RE变得贪婪,因此它们不会回溯并且'|'替代方案从左到右进行评估,因此将首先尝试最高优先级的RE。
例如,给出一串“zeroonetwothreefour”
'(one)+?|(onetwo)+?' will match 'one'
'(onetwo)+?|(one)+?' will match 'onetwo'
'(twothree)+?|(onetwothree)+?' will match 'twothree'
特别注意,在上一个示例中,'twothree'匹配,即使它稍后出现在目标字符串中,比'onetwothree'匹配更短。