【发布时间】:2012-10-14 22:13:37
【问题描述】:
我有两个字符串列表 ListA 和 ListB。我需要生成一个正则表达式,它将匹配 ListA 中的所有字符串,并且不会匹配 ListB 中的任何字符串。
- 字符串可以包含字符、数字和标点符号的任意组合。
- 如果字符串出现在 ListA 中,则保证它不会出现在 ListB 中。
- 如果一个字符串不在这两个列表中,我不在乎匹配的结果应该是什么。
列表通常包含数千个字符串,并且字符串彼此非常相似。
我知道这个问题的简单答案,就是生成(Str1)|(Str2)|(Str3) 形式的正则表达式,其中StrN 是ListA 中的字符串。但我正在寻找一种更有效的方法来做到这一点。
理想的解决方案是某种工具,它会接受两个列表并为此生成一个 Java 正则表达式。
更新 1:“高效”是指生成比普通解决方案更短的表达式。理想的算法将生成缩短的可能表达式。以下是一些示例。
ListA = { C10 , C15, C195 }
ListB = { Bob, Billy }
理想的表达方式是
/^C1.+$/
另一个例子,注意ListB的第三个元素
ListA = { C10 , C15, C195 }
ListB = { Bob, Billy, C25 }
理想的表达方式是
/^C[^2]{1}.+$/
最后一个例子
列表A = { A , D ,E , F , H } ListB = { B , C , G , I }
理想表达式与平凡解相同
/^(A|D|E|F|H)$/
另外,我不是在寻找理想的解决方案,任何比琐碎更好的事情都会有所帮助。我正在考虑生成简单解决方案列表,然后尝试合并公共子字符串,同时注意我们不会进入 ListB 领域。
**更新 2*:我并不特别担心生成 RegEx 所需的时间,现代机器上 10 分钟以内的任何内容都是可以接受的
【问题讨论】:
-
为什么需要是正则表达式?如果您想要性能匹配测试,请使用trie
-
你确定这可以只使用正则表达式来完成吗?在我看来,它需要一个算法。这也需要更多解释:" ...一个正则表达式,它将匹配 ListA 中的所有字符串,但不会匹配 ListB 中的任何字符串..."
-
我同意 Bergi 的观点——正则表达式似乎是错误的工具。
-
ListB 需要什么?如果表达式只匹配 ListA 中的字符串(保证不在 B 中),为什么还需要额外检查 ListB?
-
@Vlad,您不必担心诸如分解常见前缀之类的事情。正则表达式库在将正则表达式编译到有限状态机时会执行此操作。
标签: java regex string algorithm text