简化正则表达式

时间:2013-02-03 03:04:27

标签: java regex

我有一个非常简单的问题(惩罚右)。

这个正则表达式的最简单形式是什么?

(((0|1)*(00)(0|1)*)((0|1)*(11)(0|1)*))|(((0|1)*(11)(0|1)*)((0|1)*(00)(0|1)*))

我正在创建一个正则表达式,它接受包含子字符串00和11(以任何顺序)的所有二进制字符串的语言。

我现在的表达方式有效,但我确信它可以简化。

1 个答案:

答案 0 :(得分:5)

这几乎是相同的正则表达式。我只将(0|1)转换为[01],为左侧和右侧添加了[01]*两个案例共享(首先是11个或首先是00个)并删除了一些不必要的括号:

[01]*(00[01]*11|11[01]*00)[01]*

重现的步骤

  1. 说明

    (((0|1)*(00)(0|1)*)((0|1)*(11)(0|1)*))|(((0|1)*(11)(0|1)*)((0|1)*(00)(0|1)*))
    __^^^^^_____^^^^^___^^^^^_____^^^^^______^^^^^_____^^^^^___^^^^^_____^^^^^___

  2. 将所有(0|1)替换为[01]

    (([01]*(00)[01]*)([01]*(11)[01]*))|(([01]*(11)[01]*)([01]*(00)[01]*)) _______^^^^____________^^^^_______________^^^^____________^^^^_______

  3. 删除(00)(11)周围的括号,因为您不想捕获此群组,并且您没有*+,{{1在括号后面。因此,由于含糊不清,不需要它。

    ?
    (([01]*00[01]*)([01]*11[01]*))|(([01]*11[01]*)([01]*00[01]*))

  4. 删除更多不能解决任何不公平现象的括号:

    _^____________^^____________^___^____________^^____________^_
    ([01]*00[01]*[01]*11[01]*)|([01]*11[01]*[01]*00[01]*)

  5. ________^^^^^^^^^^_________________^^^^^^^^^^________折叠为[01]*[01]*,这意味着完全相同。

    [01]*
    ([01]*00[01]*11[01]*)|([01]*11[01]*00[01]*)

  6. 提取公共前缀和后缀_^^^^^_________^^^^^___^^^^^_________^^^^^_

    [01]*