可能重复:
如何从给定的字符串列表中自动生成正则表达式?
我有两个字符串ListA和ListB列表。我需要生成一个正则表达式,它将匹配 ListA 中的所有字符串,并且不会匹配ListB中的任何字符串。
- 字符串可以包含字符、数字和标点符号的任意组合。
- 如果字符串出现在ListA上,则保证它不会出现在ListB中。
- 如果一个字符串不在这两个列表中,我不在乎匹配的结果应该是什么。
这些列表通常包含数千个字符串,并且字符串彼此非常相似。
我知道这个问题的简单答案,它只是生成一个形式为 ListA 中的字符串(Str1)|(Str2)|(Str3)
的正则表达式。StrN
但我正在寻找一种更有效的方法来做到这一点。
理想的解决方案是某种工具,它将获取两个列表并为此生成一个 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)$/
此外,我不是在寻找理想的解决方案,任何比琐碎更好的事情都会有所帮助。我正在考虑生成简单解决方案列表,然后尝试合并公共子字符串,同时注意我们不会进入 ListB 领域。
**更新 2*:我并不特别担心生成 RegEx 所需的时间,现代机器上 10 分钟以下的任何内容都是可以接受的