2

问题说的差不多。我想出了

(ba)?(a + bb + bbbbb + aba)*(ab)?

还有什么更易读的吗?或者这是不正确的?我知道当你可以在代码中使用 !~/bbb/ 时,你不应该真的用 Regex 做这种事情,但这是一个理论练习。

谢谢。

编辑澄清:我不是|用来表示正则表达式中的 OR 位+而是使用它。对困惑感到抱歉。

编辑 2:{a,b}适用于只有 'a' 和 'b' 字符的语言。不是{最小值,最大值}。再次抱歉。

编辑 3:因为这是理论课的一部分,所以我们只是在处理 Regex 的基础知识。您可以使用的唯一内容是 +、?、() 和 *。您不能使用 {minimum, maximum)。

4

3 回答 3

1

嗯,有这样的吗?

^(a|(?<!b)b{1,2}(?!b)|b{4,})*$

编辑

编辑 3:因为这是理论课的一部分,所以我们只是在处理 Regex 的基础知识。您可以使用的唯一内容是 +、?、() 和 *。您不能使用 {minimum, maximum)。

Pfff,谈论把你的手绑在背后......简单的解决方案:你不能这样做(^$是它永远工作的要求),我们需要|. 所以,想出一个更好的条件。可以完成后视和前瞻,但不会很漂亮(至少,不会违反 DRY):

^(b|bb|bbbb+)?(a+(b|bb|bbbb+)?)*$
于 2010-08-03T13:43:21.897 回答
1

我想我有一个有效的正则表达式。让——这是我刚刚发明的一个符号——成为匹配零个或多个 b 的正则表达式,但它不会匹配其中三个。这可以用 代替(ε | b | bb | bbbb+),所以不用担心我在使用魔法或其他任何东西。现在我认为匹配的字符串可以看作是重复的零个或多个 a 的子模式,后面跟着,可能是(a*b°)*,但是你需要在 b 的序列之间至少有一个“a”。所以你的最终正则表达式是a*b°(a+b°)*.

由于可以匹配空字符串,初始a*是多余的,因为a+可以拿起初始 a 就好了,所以正则表达式可以优化到b°(a+b°)*(谢谢,wrikken)。

于 2010-08-03T14:34:15.050 回答
0

您正在匹配一个连续没有精确 3 个 b 的字符串。这意味着您正在查看诸如“aa”、“aba”、“abba”和“abbbbb*a”之类的子字符串,其中任何外部 a 都可以是字符串的开头或结尾,可以重叠,并且可以是多个。这表明类似:

(a + ab + abb + abbbbb*)*

适当添加以解决字符串开头缺少的 a 。有很多重复,但这就是正则表达式以基本形式工作的方式。

于 2010-08-03T14:12:01.957 回答