是否有一种算法可以从一组字符串中生成正则表达式(可能仅限于简化的语法),以便对与正则表达式匹配的所有可能字符串的评估再现初始字符串集?
为具有非常“复杂”语法(包括任意重复、断言等)的正则表达式语法找到这样的算法可能是不现实的,所以让我们从一个只允许OR
子字符串的简化算法开始:
foo(a|b|cd)bar
应该匹配fooabar
和。foobbar
foocdbar
例子
给定一组字符串h_q1_a
, h_q1_b
, h_q1_c
, h_p2_a
, h_p2_b
, h_p2_c
,算法的期望输出将是h_(q1|p2)_(a|b|c)
。
给定一组字符串h_q1_a
, h_q1_b
, h_p2_a
,算法的期望输出将是h_(q1_(a|b)|p2_a)
。请注意,h_(q1|p2)_(a|b)
这是不正确的,因为它扩展为 4 个字符串,包括h_p2_b
,它不在原始字符串集中。
用例
我有一长串标签,这些标签都是通过将子字符串放在一起产生的。我不想打印大量的字符串列表,而是希望有一个紧凑的输出来指示列表中的标签。由于完整列表是通过编程方式生成的(使用有限的前缀和后缀集),我希望紧凑符号(可能)比初始列表短得多。
((简化的)正则表达式应该尽可能短,尽管我对实际解决方案比最好的解决方案更感兴趣。简单的答案当然是连接所有字符串,如 A|B|C|D|...然而,没有帮助。)