简化REGEX表达式

时间:2014-02-12 02:18:15

标签: regex computer-science regular-language

我需要证明或反驳以下REGEX

(RS + R )* R = R (SR + R)*
// or, for programmers:
/(RS|R)*R/ == /R(SR|R)*/

我有一种强烈的直觉,认为它们是等同的,但我如何使用REGEX的法律逐步证明。

2 个答案:

答案 0 :(得分:4)

首先要了解这种正式语言的含义:

(RS + R)*R = R(SR + R)*

从LHS,(RS + R)*用于生成RSR的任意组合,包括^ epsilon。一些示例字符串为{^, RS, RSRS, RRRS, RSR,...}:字符串始终从R开始,但可以SR结尾 - 我们可以用英语描述:R可以出现在S始终跟随一个R的任何组合(两个连续S都不可能)。

并且,完整LHS的重新(RS + R)*R表示字符串始终以R终止。

现在,请考虑以下示例:

  1. R + SS + R相同,基本上是联合
  2. RS无法写为SR,顺序在连接中很重要
  3. (RS)R可以写成R(SR)
  4. (RS)*R可以写成R(SR)*,两者都是RSRSRS...SR
  5. (AB + AC)可以写成A(B + C)
  6. (AB + A)可以写成A(B + ^),这是因为A = ^A = A^
  7. (BA + A)可以写成(B + ^)A
  8. 正式证明:

       
       (RS + R)*R      // LHS
    => (R(S + ^))*R    // from rule 6
    => R((S + ^)R)*    // from rule 4
    => R(SR + R)*      // from rule 7, in revers `(B + ^)A` --> `(BA + A)`
    // RHS 
    

    正则表达式的相同步骤是正确的。

答案 1 :(得分:0)

是的,第一个正则表达式等于第二个。

我不能给你正式的证据,因为我不是很精通证明,但我可以暗示这些表达是平等的。

您可以手动枚举示例,如下所示:

1。)我可以生成e(epsilon)吗?

  • (RS + R)*可以是epsilon

  • R不能是epsilon

  • 连接2 =(epsilon)R或简称= R

所以你可以形成的最基本的字符串是'R'。现在继续推导字符串的过程,你会得出2正则表达式相等的结论。