2015-11-07 140 views
0

我是一個新手,並且一直在努力解決這個問題。比方說,你有這些字符串:正則表達式不匹配字符串中的模式

baa cec haw heef baas bat jackaay 

我想匹配所有不具備兩節AA的連續,所以在它上面將匹配cechawheefbat的話。

這是我迄今所做的,但它是完全錯誤的,我可以感覺到:d

\w*[^\s]*[^a\s]{2}[^\s]*\w* 
+1

所以JavaScript或Python或Perl的? –

+0

Python:'[s for s in myStrings if'aa'not in s]' – mshsayem

+0

@mshsayem'[s for s in myStrings.split()if'aa'not in s]' –

回答

0

在JavaScript中,你可以使用filter和正則表達式反轉!非捕獲組?:

var strings = ['baa','cec','haw','heef','baas','bat','jackaay']; 
strings = $(strings).filter(function(index, element){ 
    return !/.*(?:aa).*/.test(element);    // regex => .*(?:aa).* 
}); 
1

你也許想使用負前瞻:

/(^|\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 

你可以閱讀更多關於lookahead here。 請參閱it關於Regex101看看這個正則表達式是如何工作的。

+0

謝謝。這幾乎可行。它只是捕捉單詞之間的空白以及組的一部分。 –

+0

如果您選擇第二組,您將得到預期的字符串。但我認爲@stribizhev有更好的解決方案。 –

1

你需要一個正則表達式,它有兩件事情:一個字邊界\b和一個負向後的正向(它將以這種方式錨定),這將限制後面的子模式。

\b(?!\w*aa)\w+ 

參見the regex demo

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));

+0

非常感謝。我會努力去理解它是如何工作的,但它的工作原理正是我想達到的。 –

+0

請參閱[* 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 *'))。 –

相關問題