有没有生成任意等效正则表达式的方法?
Is there any method of generating arbitrary equivalent regular expressions?
我想为正则表达式分析引擎编写测试。如果我可以生成任意对的等价正则表达式,看看引擎是否正确解析它们并将它们识别为等价的,那就太好了。有没有已知的算法可以这样做?
如果有人知道预先创建的列表,我也会接受包含 20-100 个著名正则表达式等价项的列表。例如 a*a
和 aa*
或 (ab)*a
和 a(ba)*
.
我想出的方法如下 - 我组装了一个保持等价的简单正则表达式转换列表,例如(假设 a
和 b
是等价的):
f(a, b) ⩴ (a*a, bb*)
f(a, b) ⩴ (aa?, b?b)
f(a, b) ⩴ (ab, ba)
f(a, b) ⩴ (a[\d]+, b[0-9]+)
等然后,我随机并迭代地将这些转换应用于一对已知相等的起始正则表达式,例如 (x, x)
。最终结果是一对复杂但等效的正则表达式。此生成算法适用于基于 属性 的测试。
我想为正则表达式分析引擎编写测试。如果我可以生成任意对的等价正则表达式,看看引擎是否正确解析它们并将它们识别为等价的,那就太好了。有没有已知的算法可以这样做?
如果有人知道预先创建的列表,我也会接受包含 20-100 个著名正则表达式等价项的列表。例如 a*a
和 aa*
或 (ab)*a
和 a(ba)*
.
我想出的方法如下 - 我组装了一个保持等价的简单正则表达式转换列表,例如(假设 a
和 b
是等价的):
f(a, b) ⩴ (a*a, bb*)
f(a, b) ⩴ (aa?, b?b)
f(a, b) ⩴ (ab, ba)
f(a, b) ⩴ (a[\d]+, b[0-9]+)
等然后,我随机并迭代地将这些转换应用于一对已知相等的起始正则表达式,例如 (x, x)
。最终结果是一对复杂但等效的正则表达式。此生成算法适用于基于 属性 的测试。