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

Regex 如何将语言集表示法转换为正则表达式?,regex,regular-language,Regex,Regular Language,我在正则表达式中有下面的任务,我就是不能解决这些问题 L1={0n1m|n≥3.∧ m是奇数} 当字母表为{0,1}时,如何为这类问题编写正则表达式。答案是什么? 示例的正则表达式是: 000+1(11)*1 那么这有什么用呢 前两个字符,00,是文字零。这对下一点很重要 后两个字符,0+,表示“至少一个零,没有上限”。这前四个字符满足第一个条件,即至少有三个零 下一个字符1,是文字字符。因为我们需要一个奇数,这是我们允许的最小数 除一个字符以外的最后一个字符,(11),表示由两个文字字符组成的

我在正则表达式中有下面的任务,我就是不能解决这些问题

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

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

答案是什么? 示例的正则表达式是:

000+1(11)*
1

那么这有什么用呢

  • 前两个字符,
    00
    ,是文字零。这对下一点很重要
  • 后两个字符,
    0+
    ,表示“至少一个零,没有上限”。这前四个字符满足第一个条件,即至少有三个零
  • 下一个字符
    1
    ,是文字字符。因为我们需要一个奇数,这是我们允许的最小数
  • 除一个字符以外的最后一个字符,
    (11)
    ,表示由两个文字字符组成的逻辑分组,结尾的
    *
    表示与该分组零次或多次匹配。因为我们总是至少有一个
    1
    ,所以我们总是匹配一个奇数。所以我们结束了
  • 我怎么知道的? 关键在于了解正则表达式语法。我碰巧在这方面有相当多的经验,但网站帮助我进行了验证

    一旦您了解了regex的基本构造块,您就需要将问题分解为您可以表示的内容

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

    对于第二个条件,我必须考虑奇数是什么。根据定义,奇数可以用
    2*k+1
    表示,其中
    k
    是一个整数。因此,我必须匹配一个
    1
    (因此是文本
    1
    ),以及一些子字符串
    11
    。这让我找到了小组,然后是
    *
    。在一个稍微不同的问题上,您可以编写
    1(11)+
    来匹配任意奇数个1,至少3个



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

    在我读过的关于自动机理论的书中,集合表示法是相当标准的。@nhahdh我也看过很多,但我没有读过太多关于二进制字符串的正式定义的文献,所以我不确定它是通用的还是我接触过的一种约定