正则表达式匹配连续的'a'和'b'字符串是什么?

6
我需要一个正则表达式,可以匹配连续的字符串ab,例如:
ababa
bab

边缘情况(最小):

ab
ba

(没有上限。)

...并且不应该匹配:

abba
bbab
bbaabb

我尝试了几个正则表达式,但这个有点棘手。你能给我一些提示吗?
我的尝试:
- (a|b)+ - (ab|ba)*(aba|bab)+
这一个非常接近!http://www.regexr.com/38lqg

1
好的,请给我们看看你尝试了什么。 - sshashank124
2
在定义问题时,边缘情况非常重要。什么是可以接受的最小匹配?是 abba 吗? - Karoly Horvath
@KarolyHorvath 正确。 - Kenny Meyer
2
^(ab)+a?$|^(ba)+b?$ - Ulugbek Umirov
@UlugbekUmirov 不起作用:http://www.regexr.com/38lqj - Kenny Meyer
显示剩余3条评论
4个回答

7

如果您想在文本中查找匹配项(每行可能有多个单词):

\b(((ab)+a?)|((ba)+b?))\b

\b用于单词边界。


我们如何使其通用化,以适用于每个连续字符?我只是在想是否可能。 - James Sapam
@sjcipher:不太确定我理解了你的意思… 你想匹配什么样的字符串? - Karoly Horvath
我认为@sjcipher的意思是,如果有一个正则表达式可以匹配所有具有连续序列的字符串,而不仅仅是'a'和'b'。我认为这个问题应该成为它自己的问题/线程。 - Kenny Meyer
如果我把这个作为新问题发布,肯定会有人指出这个问题是重复的 :) 没关系,我还是试一下。 - James Sapam

1
    string[] abTestsPass = {
        "ababa",
        "bab",
        "ab",
        "ba",
    };
    string[] abTestsFail = {
        "abba",
        "bbab",
        "bbaabb",
        "a",
        "b",
        "",
    };

    Regex regex = new Regex("^(ab|a?(ba)+b?)$");

    foreach (string test in abTestsFail)
        System.Diagnostics.Debug.Assert(!regex.IsMatch(test));
    foreach (string test in abTestsPass)
        System.Diagnostics.Debug.Assert(regex.IsMatch(test));

这样做的缺点是它也会匹配"a""b"""。这个可以接受吗?更改了正则表达式并添加了更多的测试用例。

1
最小情况:“ab”,“ba”(请参见问题)。所以,它不会。谢谢! - Kenny Meyer
此模式匹配"a"、"b"和""。 - Idriss Neumann
我已更新正则表达式以考虑到这一点,并添加了测试用例来证明它。 - ClickRick

1
好的,这段英文可以翻译为:“你可以使用类似下面这样的东西:”。同时需要保留原文中的 HTML 标记。
^(?:ab(?:ab)*a?|ba(?:ba)*b?)$

编辑:绝对可以缩短为:

^(?:(?:ab)+a?|(?:ba)+b?)$

编辑:

如果字符串中始终存在ab,则最短严格。

\b((.)(?!\2))+.\b

但如果还有其他事情:
\b(([ab])(?!\2))+[ab]\b

1
@KennyMeyer 我认为regexr不是正确的工具。我似乎无法使用多行模式来检查多个单独的字符串。试试这个 - Jerry
1
@Jerry:如果你想在文本中查找匹配项,它是正确的工具。 - Karoly Horvath
@KarolyHorvath 好的,终于找到了多行模式:http://www.regexr.com/38lr2 如果您正在检查句子中的多个序列,请使用\b而不是^$ - Jerry
是的,用\b这个可以正常工作!谢谢@Karoly,他第一个回答得对,技术上说,所以我接受了他的答案。 - Kenny Meyer
1
@KennyMeyer 没关系。我只是按照你问题中的示例(每行一个单词)进行操作。 - Jerry

-1
(ab)(?!(ab|bb))

就像这样,我测试过了,比其他答案更简单。你可以再试一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接