不接受超过两个 'b' 的子字符串的正则表达式
Regex that does not accept sub strings of more than two 'b'
我需要一个正则表达式,它接受所有仅由字符 a
和 b
组成的字符串,除了那些连续超过两个 '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 个或多个 a
或 b
个字符,直到您匹配 bb
,这是您不想要的。另请注意,由于这部分 [a-b]+b{2,}
,字符串的长度应至少为 3 个字符
要不连续匹配 2 b
个字符,您可以通过匹配可选字符 a 或 b 来使用否定前瞻排除这些匹配,直到遇到 bb
注意 [a-b]
等同于 [ab]
\b(?![ab]*?bb)[ab]+\b
\b
一个单词边界
(?![ab]*?bb)
否定前瞻,断言不是 0+ 次 a
或 b
后跟 bb
向右
[ab]+
匹配出现 1 次以上的 a
或 b
\b
一个单词边界
在不使用环视的情况下,您可以通过匹配包含 bb
的字符串来匹配您不需要的字符串,并在第 1 组中捕获您想要保留的字符串:
\b[ab]*bb[ab]*\b|\b([ab]+)\b
或者使用以 b
开头的交替匹配和 1+ a
个字符的可选重复,后跟可选的 b
,或者匹配 1+ 以 [= 开头的重复14=] 后跟一个可选的 b
\b(?:b(?:a+b?)*|(?:a+b?)+)\b
最简单的正则表达式是:
^(?!.*bb)[ab]+$
这个正则表达式的工作原理是为 bb
添加一个负面的前瞻(锚定到开始)出现在由 a
或 b
.
组成的输入中的任何地方
如果零长度输入应该匹配,将 [ab]+
更改为 [ab]*
。
我需要一个正则表达式,它接受所有仅由字符 a
和 b
组成的字符串,除了那些连续超过两个 '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 个或多个 a
或 b
个字符,直到您匹配 bb
,这是您不想要的。另请注意,由于这部分 [a-b]+b{2,}
要不连续匹配 2 b
个字符,您可以通过匹配可选字符 a 或 b 来使用否定前瞻排除这些匹配,直到遇到 bb
注意 [a-b]
等同于 [ab]
\b(?![ab]*?bb)[ab]+\b
\b
一个单词边界(?![ab]*?bb)
否定前瞻,断言不是 0+ 次a
或b
后跟bb
向右[ab]+
匹配出现 1 次以上的a
或b
\b
一个单词边界
在不使用环视的情况下,您可以通过匹配包含 bb
的字符串来匹配您不需要的字符串,并在第 1 组中捕获您想要保留的字符串:
\b[ab]*bb[ab]*\b|\b([ab]+)\b
或者使用以 b
开头的交替匹配和 1+ a
个字符的可选重复,后跟可选的 b
,或者匹配 1+ 以 [= 开头的重复14=] 后跟一个可选的 b
\b(?:b(?:a+b?)*|(?:a+b?)+)\b
最简单的正则表达式是:
^(?!.*bb)[ab]+$
这个正则表达式的工作原理是为 bb
添加一个负面的前瞻(锚定到开始)出现在由 a
或 b
.
如果零长度输入应该匹配,将 [ab]+
更改为 [ab]*
。