1

我有无限的字符串序列和许多按优先级排序的正则表达式。对于序列中的每个字符串,我必须找到第一个匹配的正则表达式和匹配的子字符串。字符串不是很长(<1Kb),而正则表达式的数量可能从数百到数千不等。

我正在寻找一种能够有效完成这项工作的 Java 工具。我想该技术应该是在前面构建 DFA。

我目前的选择是 JFLEX。我无法在 JFLEX 中解决的问题是它的规则没有优先级,而 JFLEX 会查找与文本最长部分匹配的规则。

我的问题是我的问题是否可以用 JFLEX 解决?如果没有,你能推荐另一种 Java 工具/技术吗?

4

1 回答 1

3

您可以使用 Java 正则表达式。将备选方案构建成一个 RE 字符串,每个备选方案都用 '(' 和 ')+?' 包围 并用'|'分隔,优先级最高的REs在前。第一个构造使子 RE 变得贪婪,因此它们不会回溯和 '|' 备选方案从左到右进行评估,因此将首先尝试最高优先级的 RE。

例如,给定一个字符串“zeroonetwothreefour”

'(one)+?|(onetwo)+?' will match 'one'
'(onetwo)+?|(one)+?' will match 'onetwo'
'(twothree)+?|(onetwothree)+?' will match 'twothree'

请特别注意,在最后一个示例中,'twothree' 匹配,即使它出现在目标字符串的后面并且比 'onetwothree' 匹配更短。

于 2011-10-02T14:15:45.037 回答