我需要一個正則運算式,它接受所有只由字符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;
}
}
uj5u.com熱心網友回復:
你的模式[a-b] b{2,}[a-b]*匹配1或者更多a或者b直到你匹配字符bb這是你不想要的東西。另請注意,由于這部分字串的長度應至少為 3 個字符[a-b] b{2,}
b要不匹配一行中的 2 個字符,您可以通過匹配可選字符 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
正則運算式演示
或者使用交替匹配b1 個a字符的可選重復和可選的重復b,或者匹配 1 個重復的開始,a然后是一個可選的b
\b(?:b(?:a b?)*|(?:a b?) )\b
正則運算式演示
uj5u.com熱心網友回復:
最簡單的正則運算式是:
^(?!.*bb)[ab] $
見現場演示。
這個正則運算式的作業原理是添加一個負面的前瞻(錨定到開始)以bb出現在由a或組成的輸入中的任何地方b。
如果零長度輸入應匹配,請更改[ab] 為[ab]*。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401258.html
