簡體   English   中英

如何得到正則表達式的逆?

[英]How to get the inverse of a regular expression?

假設我有一個正則表達式,可以正常查找文本文件中的所有URL:

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

如果我想要的不是URL而是反向 - 除了URL之外的所有其他文本 - 是否有一個簡單的修改來獲得這個?

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

除了那些與正則表達式匹配的子字符串外,這將為您提供原始文本中的所有內容。

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

((?<=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字符但不捕獲。 整個事物被包裹在一個lookbehind (?<=...)以尋找它作為匹配的邊界,再次沒有捕獲該部分。

我們還希望在文件開頭匹配非URL。 \\A(?!http://[a-zA-Z0-9\\/\\.#?/%])匹配文件的開頭( \\A ),然后是否定前瞻以確保沒有URL潛伏在文件的開頭。 (這個URL檢查比第一個更簡單,因為我們只需要URL的開頭,而不是整個URL。)

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

然后我們來((?=http://[a-zA-Z0-9\\/\\.#?/%])|\\Z) 在這里,我們再次使用(?=http://[a-zA-Z0-9\\/\\.#?/%])檢查URL的開頭。 文件的結尾也是一個非常好的跡象,表明我們已經達到了匹配的結束,所以我們也應該使用\\Z來尋找它。 同樣第一大集團,我們把它包在括號中和OR兩種可能性在一起。

| 符號需要括號,因為它的優先級非常低,因此您必須明確說明OR的邊界。

這個正則表達式在很大程度上依賴於零寬度斷言( \\A\\Z錨點以及環視組)。 在將它用於任何嚴重或永久性的事情之前,你應該總是理解一個正則表達式(否則你可能會遇到perl的情況),所以你可能想要檢查字符串的開頭和字符串錨點的結束以及Lookahead和Lookbehind零寬度斷言

當然,更正歡迎!

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

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

我不確定這是否會按照您的意圖完成,但它可能會有所幫助:無論您放置在方括號[]中的哪一個都將被匹配。 如果你把^支架,即在[^ A-ZA-Z0-9 /]它將匹配除了什么是在括號中的一切。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM