什么正则表达式匹配连续' a'和' b'?

时间:2014-04-06 13:58:09

标签: regex

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

ababa
bab

边缘情况(最小):

ab
ba

(没有上限。)

... 不应该匹配:

abba
bbab
bbaabb

我尝试了几个正则表达式,但这个有点棘手。你能给我任何提示吗?

我的尝试:

  • (a|b)+
  • (ab|ba)*(aba|bab)+

这个非常接近! http://www.regexr.com/38lqg

4 个答案:

答案 0 :(得分:7)

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

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

\b用于字边界。

答案 1 :(得分: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"""。这可以接受吗?

更改了正则表达式。添加了更多测试用例。

答案 2 :(得分:1)

嗯,你可以使用这样的东西:

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

编辑:绝对可以缩短为:

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

编辑:

如果字符串中始终有ab,则严格缩短:

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

但如果还有别的东西:

\b(([ab])(?!\2))+[ab]\b

答案 3 :(得分:-1)

(ab)(?!(ab|bb))

就像那样,我测试过并且没有其他答案那么复杂 你可以再试一次。