我是一個新手,並且一直在努力解決這個問題。比方說,你有這些字符串:正則表達式不匹配字符串中的模式
baa cec haw heef baas bat jackaay
我想匹配所有不具備兩節AA的連續,所以在它上面將匹配cec
,haw
,heef
,bat
的話。
這是我迄今所做的,但它是完全錯誤的,我可以感覺到:d
\w*[^\s]*[^a\s]{2}[^\s]*\w*
我是一個新手,並且一直在努力解決這個問題。比方說,你有這些字符串:正則表達式不匹配字符串中的模式
baa cec haw heef baas bat jackaay
我想匹配所有不具備兩節AA的連續,所以在它上面將匹配cec
,haw
,heef
,bat
的話。
這是我迄今所做的,但它是完全錯誤的,我可以感覺到:d
\w*[^\s]*[^a\s]{2}[^\s]*\w*
在JavaScript中,你可以使用filter
和正則表達式反轉!
非捕獲組?:
。
var strings = ['baa','cec','haw','heef','baas','bat','jackaay'];
strings = $(strings).filter(function(index, element){
return !/.*(?:aa).*/.test(element); // regex => .*(?:aa).*
});
你也許想使用負前瞻:
/(^|\s)(?!\w*aa\w*)(\w+)/gi
您可以通過粘貼檢查字符串在控制檯上的代碼在Chrome /火狐(F12):
var pattern = /(^|\s)(?!\w*aa\w*)(\w+)/gi;
var str = 'baa cec haw heef baas bat jackaay';
while(match = pattern.exec(str))
console.log(match[2]); // position 2 is (\w+) in regex
謝謝。這幾乎可行。它只是捕捉單詞之間的空白以及組的一部分。 –
如果您選擇第二組,您將得到預期的字符串。但我認爲@stribizhev有更好的解決方案。 –
你需要一個正則表達式,它有兩件事情:一個字邊界\b
和一個負向後的正向(它將以這種方式錨定),這將限制後面的子模式。
\b(?!\w*aa)\w+
Regex的擊穿:
\b
- 字邊界(?!\w*aa)
- 負先行將取消一個匹配,如果字具有0個或多個字的字符,隨後兩個a
s\w+
- 1或更多的單詞字符。代碼演示:
var re = /\b(?!\w*aa)\w+/gi;
var str = 'baa cec haw heef bAas bat jackaay bar ha aa lar';
var res = str.match(re);
document.write(JSON.stringify(res));
非常感謝。我會努力去理解它是如何工作的,但它的工作原理正是我想達到的。 –
請參閱[* Word邊界*](http://www.regular-expressions.info/wordboundaries.html)和[* Lookahead和Lookbehind Zero-Length Assertions *](http://www.regular-expressions.info /lookaround.html)文章。主模式是'\ w'(字母數字+下劃線匹配的子模式),只有在非單詞字符(不是[a-zA-Z0-9_]')之後匹配一次或多次('+')if它沒有'aa'(因爲如果它在零個或多個字符之後有'aa',我們首先用lookahead檢查這個單詞('\ w *'))。 –
所以JavaScript或Python或Perl的? –
Python:'[s for s in myStrings if'aa'not in s]' – mshsayem
@mshsayem'[s for s in myStrings.split()if'aa'not in s]' –