【问题标题】:Is there any method of generating arbitrary equivalent regular expressions?有什么方法可以生成任意等价的正则表达式吗?
【发布时间】:2021-12-27 21:29:00
【问题描述】:

我想为正则表达式分析引擎编写测试。如果我可以生成任意对等价的正则表达式,看看引擎是否正确解析它们并将它们识别为等价,那就太好了。有没有已知的算法可以做到这一点?

如果有人知道预先创建的列表,我也会接受 20-100 个众所周知的正则表达式等效项的列表。例如a*aaa*(ab)*aa(ba)*

【问题讨论】:

  • (ab)*aa(ba)* 不等价。
  • @Donut 什么是反例?
  • () 定义的组的内容会有所不同,即使两个模式匹配相同的文本。
  • @Donut 等价我的意思是两个正则表达式都定义了相同的常规语言。
  • 啊,我明白了。有趣的问题......我很想知道其他人是否有任何见解。

标签: regex property-based-testing


【解决方案1】:

我想出的方法如下 - 我组装了一个简单的正则表达式转换列表,它保留了等价性,例如(假设 ab 是等价的):

  • 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)。最终结果是一对复杂但等效的正则表达式。此生成算法适用于基于属性的测试。

【讨论】:

  • 我发现测试正则表达式引擎是一个非常有趣的话题,因为它解决了基于属性的测试中的一些基本问题,例如有效的测试用例生成、oracle 问题等。我想看看 (并讨论)您拥有的其他属性测试;代码是开源的吗?
  • 另一条评论:分析引擎的实现是否也使用相同的一组转换来决定等价?如果是这样,您可能已经落入了自动化测试的“重言式陷阱”。
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2012-05-11
相关资源
最近更新 更多