2010-03-31 106 views
3

這是JavaScript的正則表達式。正則表達式:如何去除以.dtd結尾的網址

regex = /(http:\/\/[^\s]*)/g; 

text = "I have http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd and I like http://google.com a lot"; 

matches = text.match(regex); 

console.log(matches); 

我在結果中都得到了這兩個網址。不過,我想消除所有以.dtd結尾的網址。我怎麼做?

請注意,我說的是以.dtd結尾應該被刪除。這意味着像http://a.dtd.google.com這樣的網址應該通過。

回答

3

做到這一點的最好的方式是使用負回顧後(在語言支持它們):

/(?>http:\/\/[^\s]*)(?<!\.dtd)/g 

?>在第一托架使其成爲原子團,其停止所述正則表達式引擎回溯 - 因此它會像現在一樣匹配完整的URL,並且如果/當下一部分失敗時,它不會嘗試返回並匹配較少。

(<!\.dtd)是負回顧後,其僅當\.dtd匹配在該位置(即,URL不.dtd結束)結束相匹配。

對於不(比如JavaScript),你可以做,而不是負先行,這是比較難看了一點,一般是低效率的語言:

/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g 

將匹配http://,然後掃描前進以確保它不會在.dtd結束,然後再回溯並再次向前掃描以獲得實際匹配。

與往常一樣,http://www.regular-expressions.info/是獲取更多信息

+0

越來越語法錯誤,因爲在

<
(?<!\。DTD) – 2010-03-31 13:02:36

+0

嗯一個很好的參考。那麼JavaScript可能不支持向後看。在這種情況下,我想不出一種好的方法,你可以用一個正則表達式來完成 - 最好的辦法就是使用你現在擁有的東西,循環播放結果並手動刪除以「.dtd」結尾的所有內容。 – Chris 2010-03-31 13:06:43

+0

我知道JavaScript不支持查看。不過它確實支持積極和消極的前瞻。 – 2010-03-31 13:10:57