是否有一种算法可以从一组字符串生成正则表达式(可能仅限于简化语法),以便对与正则表达式匹配的所有可能字符串进行求值,从而重现初始字符串集?
为具有非常“复杂”语法(包括任意重复、断言等)的正则表达式语法找到这样一种算法可能是不现实的,所以让我们从一个简化的算法开始,它只允许OR
子串数:
foo(a|b|cd)bar
应该匹配fooabar
, foobbar
and foocdbar
.
Examples
给定一组字符串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)
would not 是正确的,因为它扩展到 4 个字符串,包括h_p2_b
,这不在原始字符串集中。
Use case
我有一长串标签,它们都是通过将子字符串放在一起生成的。我不想打印大量的字符串列表,而是希望有一个紧凑的输出来指示列表中的标签。由于完整列表是通过编程方式生成的(使用有限的前缀和后缀集),我预计紧凑符号(可能)比初始列表短得多。
((简化的)正则表达式应该尽可能短,尽管我对实用解决方案比最佳解决方案更感兴趣。简单的答案当然是连接所有字符串,例如 A|B|C|D|...然而,这并没有帮助。)