我在正则表达式中进行了以下任务,我无法理解这些问题。
L1 = {0 n 1 m | n≥3∧m是奇数}
当字母为{0,1}时,如何为这类问题编写正则表达式。
答案 0 :(得分:6)
您的示例的正则表达式为:
000+1(11)*
1
这是做什么的?
00
是字面零。这对下一点非常重要0+
,表示"至少一个零,没有上限"。前四个字符满足第一个条件,即我们至少有三个零。1
是字面的字符。由于我们需要奇数个,这是我们允许的最小数字(11)
表示两个字面值的逻辑分组,结尾*
表示将此分组匹配零次或多次。由于我们始终至少有一个1
,因此我们总是匹配一个奇数。所以我们已经完成了。关键是了解正则表达式语法。我碰巧有相当多的经验,但this网站帮助我验证。
一旦了解了正则表达式的基本构建块,就需要将问题分解为可以表示的问题。
例如,正则表达式允许我们指定匹配的下限和上限({x,y}
语法),但不允许仅指定下限({x}
将完全匹配x
次。所以我知道我必须使用+
或*
来指定零,因为这些是唯一允许无限数量匹配的说明符。我也知道将这些修饰符应用于一个组是没有意义的;我们必须拥有至少3个零的限制并不意味着我们必须有三个的倍数,例如,(000)+
已经出局。我不得不将修饰符仅应用于一个字符,这意味着我必须首先匹配几个文字。 000
保证只匹配三个0
,0*
(最终结果0000*
)完全符合我的要求,然后我将其浓缩为等效的000+
对于第二个条件,我不得不考虑奇数是多少。根据定义,奇数可以用2*k + 1
表示,其中k
是整数。所以我必须匹配一个1
(因此是文字1
)和一些子字符串11
。这导致我进入小组,然后是*
。在略有不同的问题上,您可以编写1(11)+
以匹配任何奇数个,并且至少为3.
1 我的一位同事向我指出,+
运算符在技术上并不是正则表达式的正式定义的一部分。如果这是一个学术问题而不是编程问题,您可能会发现0000*
版本更有帮助。在这种情况下,最终字符串将是0000*1(11)*