我真的被这两个问题困扰了两天多。我试图弄清楚这个问题是什么意思。我的导师也在外地。
问题 1:为仅不是由表达式在 {a,b} 上生成的字符串编写一个正则表达式:(a+b)****a(a+b)****
。解释你的推理。
我尝试了第二个问题。你觉得还有比这个更好的答案吗?
什么是一组包含奇数个a
s 或恰好两个b
s的字符串的正则表达式,(a((a|b)(a|b))****|bb)
我知道它代表任何奇数长度的 a,RE 是a((a|b)(a|b))****
我真的被这两个问题困扰了两天多。我试图弄清楚这个问题是什么意思。我的导师也在外地。
问题 1:为仅不是由表达式在 {a,b} 上生成的字符串编写一个正则表达式:(a+b)****a(a+b)****
。解释你的推理。
我尝试了第二个问题。你觉得还有比这个更好的答案吗?
什么是一组包含奇数个a
s 或恰好两个b
s的字符串的正则表达式,(a((a|b)(a|b))****|bb)
我知道它代表任何奇数长度的 a,RE 是a((a|b)(a|b))****
这是第一个问题的开始。首先考虑这个正则表达式生成的字符串:
(a+b)*a(a+b)*
a
它必须以AND开头b
必须在其a
前面至少有一个 an 并且aab
,否则字符串必须以 结尾a
。与此相反的是:
a
OR开头b
不在a
OR之后ab
。对于第二个问题,您应该检查您是否正确理解了该问题。你的解释似乎是:
包含(奇数个 a 和任意数量 b)或(正好两个 b 而没有 a)的字符串集的正则表达式是什么。
但另一种解释是:
包含(奇数个 a 和任意数量 b)或(正好两个 b 和任意数量 a)的字符串集的正则表达式是什么。
要匹配两个a
,您会使用类似aa
right? 现在我们知道+
是 1 或更多*
的量词,而 是 0 或更多的量词。所以如果我们想重复整个模式,我们可以把它放在一个组中,然后像这样重复整个模式(aa)+
:
那将匹配:
aa
aaaa
但不是:
a
(因为aa
至少需要 2 项)`aaa
(因为aa
会匹配前两个,但你会有一个额外的a
)如果我们想让奇数变成偶数,我们可以简单地在组外添加一个,如下所示a
:a(aa)+
但是,由于我们想要一个没有特定最小值的奇数,我们不应该使用+
它,因为这至少需要 3 a
。
所以整个答案是:(bb|a(aa)*)
听起来第一个问题是要求您为与提供的正则表达式不匹配的字符串集编写正则表达式。
例如,假设问题是要求为不匹配aa+
超过 {a} 的字符串集提供正则表达式。好吧,这里有一些匹配的字符串:
有哪些不匹配的字符串?这里只有两个:
后一组的正则表达式是a?
.
关于第二个问题,我建议鼓吹一些正面和负面的测试用例。通过你的正则表达式运行一些这样的字符串,看看会发生什么:
祝你好运!
表达式(a+b)*a(a+b)*
只是意味着:字符串内部必须有一个。a
此表达式无法生成的唯一字符串是:b*
此表达式意味着 RE 必须在表达式中包含至少 1 个“A”。
这个表达式不接受
'b' 'b'* 或空集