是否存在一种算法可以从一组字符串中生成一个正则表达式(可能仅限于简化语法),使得匹配该正则表达式的所有可能字符串都能够产生初始的字符串集?
对于具有非常“复杂”语法(包括任意重复、断言等)的正则表达式语法,找到这样的算法可能不现实,因此让我们从一种只允许子串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|…,但这并不是有益的。
regexp-opt
的函数。请参见源代码和描述。该代码有很好的注释,因此您可能能够移植其中的一些内容。 - legosciah_(?:q1|p2)_[a-c]
,对吧? :) - zx81?:
吗?但是你说的[a-c]
比(a|b|c)
更短。通常,子字符串会比一个字符更长。 - fuenfundachtzig