不接受超过两个 'b' 的子字符串的正则表达式

Regex that does not accept sub strings of more than two 'b'

我需要一个正则表达式,它接受所有仅由字符 ab 组成的字符串,除了那些连续超过两个 'b' 的字符串。

例如,这些不应该匹配:

abb
ababbb
bba
bbbaa
bbb
bb

我想到了这个,但它不起作用

[a-b]+b{2,}[a-b]*

这是我的代码:

int main() {
    string input;
    regex validator_regex("\b(?:b(?:a+b?)*|(?:a+b?)+)\b");
    
    cout << "Hello, "<<endl;
    while(regex_match(input,validator_regex)==false){
        cout << "please enter your choice of regEx :"<<endl;
        cin>>input;
        if(regex_match(input,validator_regex)==false)
            cout<<input+" is not a valid input"<<endl;
        else
            cout<<input+" is  valid "<<endl;
    }
}

您的模式 [a-b]+b{2,}[a-b]* 匹配 1 个或多个 ab 个字符,直到您匹配 bb,这是您不想要的。另请注意,由于这部分 [a-b]+b{2,}

,字符串的长度应至少为 3 个字符

要不连续匹配 2 b 个字符,您可以通过匹配可选字符 a 或 b 来使用否定前瞻排除这些匹配,直到遇到 bb

注意 [a-b] 等同于 [ab]

\b(?![ab]*?bb)[ab]+\b
  • \b一个单词边界
  • (?![ab]*?bb) 否定前瞻,断言不是 0+ 次 ab 后跟 bb 向右
  • [ab]+ 匹配出现 1 次以上的 ab
  • \b一个单词边界

Regex demo


在不使用环视的情况下,您可以通过匹配包含 bb 的字符串来匹配您不需要的字符串,并在第 1 组中捕获您想要保留的字符串:

\b[ab]*bb[ab]*\b|\b([ab]+)\b

Regex demo


或者使用以 b 开头的交替匹配和 1+ a 个字符的可选重复,后跟可选的 b,或者匹配 1+ 以 [= 开头的重复14=] 后跟一个可选的 b

\b(?:b(?:a+b?)*|(?:a+b?)+)\b

Regex demo

最简单的正则表达式是:

^(?!.*bb)[ab]+$

live demo

这个正则表达式的工作原理是为 bb 添加一个负面的前瞻(锚定到开始)出现在由 ab.

组成的输入中的任何地方

如果零长度输入应该匹配,将 [ab]+ 更改为 [ab]*