<分区>
Possible Duplicate:
How to auto generate regex from given list of strings?
我有两个字符串列表 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}.+$/
最后一个例子
ListA = { A , D ,E , F , H } ListB = { B , C , G , I }
理想的表达方式与平凡的解决方案相同
/^(A|D|E|F|H)$/
此外,我并不是在寻找理想的解决方案,任何比琐碎的问题都更好的解决方案都会有所帮助。我一直在思考生成简单解决方案列表的思路,然后尝试合并公共(public)子字符串,同时注意我们不会漫游到 ListB 领域。
**更新 2*:我并不特别担心生成 RegEx 所花费的时间,在现代机器上任何少于 10 分钟的时间都是可以接受的