我需要一个匹配连续a
和b
字符串的正则表达式,例如:
ababa
bab
边缘情况(最小):
ab
ba
(没有上限。)
... 不应该匹配:
abba
bbab
bbaabb
我尝试了几个正则表达式,但这个有点棘手。你能给我任何提示吗?
我的尝试:
(a|b)+
(ab|ba)*(aba|bab)+
这个非常接近! http://www.regexr.com/38lqg
答案 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?)$
编辑:
如果字符串中始终有a
和b
,则严格缩短:
\b((.)(?!\2))+.\b
但如果还有别的东西:
\b(([ab])(?!\2))+[ab]\b
答案 3 :(得分:-1)
(ab)(?!(ab|bb))
就像那样,我测试过并且没有其他答案那么复杂 你可以再试一次。