我有两个字符串列表ListA和ListB。我需要生成一个正则表达式,可以匹配ListA中的所有字符串,并且不匹配ListB中的任何字符串。
我知道这个问题的平凡答案,就是生成形如(Str1)|(Str2)|(Str3)的正则表达式,其中StrN是来自ListA的字符串。但我正在寻找一种更有效的方法来解决这个问题。
另一个例子,注意ListB的第三个元素。
此外,我不是在寻找理想的解决方案,任何比平凡更好的东西都会有所帮助。我考虑生成平凡解决方案列表,然后尝试合并公共子字符串,同时观察我们不要偏离ListB领域。更新2:我并不特别担心生成正则表达式所需的时间,在现代计算机上,任何少于10分钟的时间都是可以接受的。
- 字符串可以包含任意组合的字符、数字和标点符号。
- 如果一个字符串出现在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)$/
此外,我不是在寻找理想的解决方案,任何比平凡更好的东西都会有所帮助。我考虑生成平凡解决方案列表,然后尝试合并公共子字符串,同时观察我们不要偏离ListB领域。更新2:我并不特别担心生成正则表达式所需的时间,在现代计算机上,任何少于10分钟的时间都是可以接受的。