如何将语言集表示法转换为正则表达式?

时间:2014-10-09 19:07:40

标签: regex regular-language

我在正则表达式中进行了以下任务,我无法理解这些问题。

  

L1 = {0 n 1 m | n≥3∧m是奇数}

当字母为{0,1}时,如何为这类问题编写正则表达式。

1 个答案:

答案 0 :(得分:6)

答案是什么?

您的示例的正则表达式为:

000+1(11)* 1

这是做什么的?

  1. 前两个字符00是字面零。这对下一点非常重要
  2. 后两个字符0+,表示"至少一个零,没有上限"。前四个字符满足第一个条件,即我们至少有三个零。
  3. 下一个字符1是字面的字符。由于我们需要奇数个,这是我们允许的最小数字
  4. 最后一个字符(11)表示两个字面值的逻辑分组,结尾*表示将此分组匹配零次或多次。由于我们始终至少有一个1,因此我们总是匹配一个奇数。所以我们已经完成了。
  5. 我是怎么做到的?

    关键是了解正则表达式语法。我碰巧有相当多的经验,但this网站帮助我验证。

    一旦了解了正则表达式的基本构建块,就需要将问题分解为可以表示的问题。

    例如,正则表达式允许我们指定匹配的下限和上限({x,y}语法),但不允许仅指定下限({x}将完全匹配x次。所以我知道我必须使用+*来指定零,因为这些是唯一允许无限数量匹配的说明符。我也知道将这些修饰符应用于一个组是没有意义的;我们必须拥有至少3个零的限制并不意味着我们必须有三个的倍数,例如,(000)+已经出局。我不得不将修饰符仅应用于一个字符,这意味着我必须首先匹配几个文字。 000保证只匹配三个00*(最终结果0000*)完全符合我的要求,然后我将其浓缩为等效的000+

    对于第二个条件,我不得不考虑奇数是多少。根据定义,奇数可以用2*k + 1表示,其中k是整数。所以我必须匹配一个1(因此是文字1)和一些子字符串11。这导致我进入小组,然后是*。在略有不同的问题上,您可以编写1(11)+以匹配任何奇数个,并且至少为3.


    1 我的一位同事向我指出,+运算符在技术上并不是正则表达式的正式定义的一部分。如果这是一个学术问题而不是编程问题,您可能会发现0000*版本更有帮助。在这种情况下,最终字符串将是0000*1(11)*