Regex 如何将语言集表示法转换为正则表达式?
我在正则表达式中有下面的任务,我就是不能解决这些问题 L1={0n1m|n≥3.∧ m是奇数} 当字母表为{0,1}时,如何为这类问题编写正则表达式。答案是什么? 示例的正则表达式是:Regex 如何将语言集表示法转换为正则表达式?,regex,regular-language,Regex,Regular Language,我在正则表达式中有下面的任务,我就是不能解决这些问题 L1={0n1m|n≥3.∧ m是奇数} 当字母表为{0,1}时,如何为这类问题编写正则表达式。答案是什么? 示例的正则表达式是: 000+1(11)*1 那么这有什么用呢 前两个字符,00,是文字零。这对下一点很重要 后两个字符,0+,表示“至少一个零,没有上限”。这前四个字符满足第一个条件,即至少有三个零 下一个字符1,是文字字符。因为我们需要一个奇数,这是我们允许的最小数 除一个字符以外的最后一个字符,(11),表示由两个文字字符组成的
000+1(11)*
1
那么这有什么用呢
00
,是文字零。这对下一点很重要0+
,表示“至少一个零,没有上限”。这前四个字符满足第一个条件,即至少有三个零1
,是文字字符。因为我们需要一个奇数,这是我们允许的最小数(11)
,表示由两个文字字符组成的逻辑分组,结尾的*
表示与该分组零次或多次匹配。因为我们总是至少有一个1
,所以我们总是匹配一个奇数。所以我们结束了{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我也看过很多,但我没有读过太多关于二进制字符串的正式定义的文献,所以我不确定它是通用的还是我接触过的一种约定