2015-01-13 59 views
1

這更多的是爲了滿足我的好奇心而不是真正需要幫助的問題,但是我會很感激您的幫助,因爲這會讓我發瘋。javascript正則表達式中的精確字符串否定

我想取消使用Javascript正則表達式的確切字符串,這個想法是排除包含字符串「www」的URL。比如這個名單:

http://www.example.org/ 
http://status.example.org/index.php?datacenter=1 
https://status.example.org/index.php?datacenter=2 
https://www.example.org/Insights 
http://www.example.org/Careers/Job_Opportunities 
http://www.example.org/Insights/Press-Releases 

對於我能成功地使用下面的正則表達式:

/^http(|s):..[^w]/g 

這工作正常,但在我可以做一個積極的比賽,我不能這樣做:

/[^www]/g or /[^http]/g 

要排除包含確切字符串www或http的行。我曾嘗試臭名昭著的「負Lookeahead」這樣的:

/*(?: (?!www).*)/g 

但是,這並不工作,要麼我也可以不在線測試它,它不會在記事本作品++兩種。

如果我使用Perl,grep的,awk中或我的TextWrangler會做簡單:

!www OR !http 

而這一切都完成任務。

所以,我的問題顯然是:在JavaScript中做這種事情的正確方法是什麼?這是否依賴於正則表達式解析器(正如我似乎瞭解?)。

感謝您的任何答案;)

回答

3

您需要在開始添加一個負前瞻。

^(?!.*\bwww\.)https?:\/\/.* 

DEMO

(?!.*\bwww\.)負先行斷言,字符串,我們要匹配將不包含,www.\b表示在單詞字符和非單詞字符之間匹配的單詞邊界。如果沒有\bwww.在你的正則表達式將在foowww.

+0

Whoaaa,非常感謝! 現在我需要掌握它的工作原理。我的意思是,我可以「讀」它,我看到有一個負面的前瞻和一個字邊界......現在我看到W3C學校的參考非常有限,這裏有更多:https:// developer。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp Cool,THX,對於像我這樣的bash人來說,需要一些時間來習慣這種類型的正則表達式的邏輯。 – runlevel0

+1

@ runlevel0哪一部分你不明白。問我,我會解釋.. –

+0

嗨Avinash:我明白了,它慢慢閱讀,並一步一步。我的意思是,我需要學會用「說」和「思考」,就像我用來思考和說Perl或Bash正則表達式一樣。這就像學習一種新的語言;)感謝您的興趣! – runlevel0

0

匹配www.要在輸入字符串否定的「www」在每個位置上:所以,在每個位置上的支票,「WWW」不匹配

var a = [ 
    'http://www.example.org/', 
    'http://status.example.org/index.php?datacenter=1', 
    'https://status.example.org/index.php?datacenter=2', 
    'https://www.example.org/Insights', 
    'http://www.example.org/Careers/Job_Opportunities', 
    'http://www.example.org/Insights/Press-Releases' 
]; 
a.filter(function(x){ return /^((?!www).)*$/.test(x); }); 

,然後匹配 任意字符(.)。

相關問題