2009-07-17 27 views
2

比方說,我有一個正則表達式可以正常工作,找到所有的URL的一個文本文件:如何獲取正則表達式的逆函數?

(http://)([a-zA-Z0-9\/\.])* 

如果我想是不是網址,但逆 - 除了網址的所有其他文本 - 是有一個簡單的修改,以獲得此?

+1

您應該在上下文中包含指向原始問題的鏈接(http://stackoverflow.com/questions/1140921/regex-to-strip-out-image-urls)。 – Lee 2009-07-17 01:07:01

回答

4

如果由於某種原因,你需要一個唯一的正則表達式的解決方案,試試這個:

((?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]))|\A(?!http://[a-zA-Z0-9\/\.#?/%])).+?((?=http://[a-zA-Z0-9\/\.#?/%])|\Z) 

我擴大了一整套的URL字符的小([a-zA-Z0-9\/\.#?/%]),包括一些重要的,但這決不意味着確切或詳盡。

正則表達式是有點怪的,所以我會盡力把它分解:

(?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]) 

第一藥水URL的結尾匹配。 http://[a-zA-Z0-9\/\.#?/%]+與URL本身相匹配,而(?=[^a-zA-Z0-9\/\.#?/%])聲稱該URL必須後跟一個非URL字符,以便我們確信我們到了最後。使用向前查找,以便查找非URL字符但不捕獲。整個事情被包裹在一個倒影(?<=...)中,以尋找它作爲比賽的邊界,同樣沒有捕獲該部分。

我們還希望在文件的開頭匹配一個非URL。 \A(?!http://[a-zA-Z0-9\/\.#?/%])與文件的開頭(\A)相匹配,然後是負向前視,以確保文件開頭處沒有潛在的URL。 (此URL檢查是比第一個更簡單,因爲我們只需要URL,而不是整個事情的開始。)

這兩項檢查都放在括號和OR「隨着|字符D一起。之後,.+?與我們試圖捕獲的字符串相匹配。

然後我們來到((?=http://[a-zA-Z0-9\/\.#?/%])|\Z)。在這裏,我們再次檢查網址的開頭是(?=http://[a-zA-Z0-9\/\.#?/%])。文件的結尾也是一個很好的跡象,表明我們已經達到了比賽結束,所以我們也應該使用\Z來查找。與第一大組類似,我們將它包括在括號和兩個可能性中。

|符號需要括號,因爲它的優先級很低,所以您必須明確說明OR的邊界。

該正則表達式很大程度上依賴於零寬度斷言(\A\Z錨點以及環視組)。在將它用於任何嚴重或永久的任何事情之前,您應該始終了解正則表達式(否則您可能會遇到perl案例),因此您可能需要檢出Start of String and End of String AnchorsLookahead and Lookbehind Zero-Width Assertions

更正歡迎,當然!

+0

我看你把這個當成了接受的答案。謝謝!不過,我想重申我對複雜正則表達式的警告。如果您或其他人將在稍後閱讀代碼,請將其記錄下來。 此外,[a-zA-Z0-9 \/\。#?/%]可以更改爲[a-zA-Z0-9 /.#?%] - 您(通常)不需要轉義字符組內的符號。根據您的要求,您可能還想嘗試使用https?://而不是http://以及其他可能的協議。不要忘記查看http://www.regular-expressions.info/,正如superjadex12建議的那樣。 – WCWedin 2009-07-19 13:28:16

7

您可以簡單地搜索並用空字符串替換與正則表達式匹配的所有內容。在Perl中s/(http:\/\/)([a-zA-Z0-9\/\.])*//g

這會給你在原始文本中的所有內容,除了那些匹配正則表達式的子字符串。

+0

因此,在替換所有匹配之後,如果測試字符串的長度不爲零,那麼您的反轉正則表達式爲true。這正是我需要的邏輯,而不是構建一個倒轉的正則表達式。謝謝dmcer :) – Exter 2012-09-12 15:46:05

1

如果我正確地理解了這個問題,您可以在表達式中使用搜索/替換...只是通配符,然後替換第一個和最後一個部分。

s/^(.*)(your regex here)(.*)$/$1$3/ 
+1

這隻會刪除一個匹配:最後一個。而且效率非常低。 – 2009-07-17 04:09:34

0

林不知道這是否會工作,完全按照自己的打算,但它可能會幫助: 無論你在[]將進行匹配的支架放置。如果將^放在括號內,即[^ a-zA-Z0-9 /。],它將匹配以外的所有內容,但括號內的內容除外。

http://www.regular-expressions.info/