2012-03-01 23 views
-3

你如何閱讀這個正則表達式?正則表達式的鏈接 - 幫助理解它

#(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?#i 

這是鏈接一個正則表達式,但我有當你說你無法理解它鬧明白它

感謝

+2

哪個部位有問題? – ruakh 2012-03-01 20:31:35

+2

我相對肯定'''應該逃脫。至於理解它:http://www.regular-expressions.info/是一個很好的開始。 – 2012-03-01 20:36:18

回答

6

根據您使用的語言,正則表達式需要一個分隔符。似乎在這裏使用#(井號或散列)。所以,

#...actual regex goes here...# 

在JavaScript中你需要正斜槓(/..../)。

一些正則表達式引擎允許您傳遞影響匹配過程的標誌。這些出現在結束分隔符之後:

#...actual regex goes here...#..flags go here.. 

在您的例子,有一個標誌,I和我猜測的意思是:「不區分大小寫」(我的不敏感)。根據正則表達式引擎,你可以使用標誌來影響你可以用於實際正則表達式的語法(例如,點可以匹配任何字符或除了換行符之外的任何字符,這取決於是否傳遞了一個標誌),影響匹配完成(例如,在JavaScript中,表示全局標誌,這意味着匹配字符串內的任何地方完成,並保存狀態),標誌確定是否允許空格在正則表達式中作爲縮進。還有一些m標誌表示是否將逐行應用正則表達式,還是應用於整個文本。有AFAIK沒有標準的標誌,檢查你的正則表達式引擎文檔。

如果您有多個標誌,您只需將它們連接在一起成爲一串標誌並將它們放在關閉分隔符後面。

現在爲實際的正則表達式。首先,從括號內的表達式開始:

(...group...) 

這也稱爲組。在許多正則表達式引擎中,這些組具有特殊含義,因爲當找到匹配項時,可以使用特殊變量訪問與組內表達式匹配的文本位(或者有時,匹配返回爲數組,其中每個元素代表一個組)。如果您可以訪問組內的位,則稱爲「捕獲組」。

在這種特殊情況下,組使用「替代」或「選擇」,這由| (管)。管道是正則表達式語法的一部分,意思是「或」。匹配 「HTTP」,或者,如果不匹配, 「HTTPS」,如果不匹配, 「FTP」:那麼,

(http|https|ftp) 

手段。這也提出了使用括號的另一個原因:在所有特殊的正則表達式語法操作符中,管道的優先級最低,所以括號不會在那裏,它意味着:匹配「http」或「https」或「ftp: //...c「

到目前爲止,我們已經看到這些」特殊字符「:| (管道)和(和)。之後,我們得到

:// 

這些不是特殊字符,並且任何非特殊字符只是簡單地匹配它們自己。

我們再拿到另外一組,它構成了正則表達式的幾乎休息:

([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+) 

它裏面,我們看到了一個括號表達式:

[A-Z0-9] 

的括號[和]是特殊,並指出一個「角色班」。還有其他方式來表示字符類,但是在任何情況下,字符類都會匹配單個字符。哪個角色取決於班級的性質。在這種情況下,類是使用兩個範圍定義:

A-Z 

意味着字符A至Z(以及任何在它們之間),並

0-9 

意味着字符0至9(以及任何在它們之間)。

基本上,[A-Z0-9]匹配任何字母數字字符。 請注意,範圍邊界之間的短劃線只是這些括號內的表達式中的特殊字符。矛盾的是,括號內的短劃線也可以簡單地表示短劃線,如果它不能被解釋爲範圍。

這是由另一個字符類folllowed:

[A-Z0-9_-] 

幾乎同前,它只是增加了下劃線和破折號。這最後一個破折號不能被解釋爲範圍分隔符,所以它只是意味着一個破折號。此字符類將匹配任何字母數字字符以及下劃線和短劃線。

該類後面跟着一個*(星號),這是一個表示基數的特殊字符。基數指定了前一個元素可能出現的頻率。這些是常見的基數:

  • *(星號)表示零次或多次。
  • ?(問題掩碼)表示零或一次。
  • +(加號)表示一次或多次。

現在整個比特開始纔有意義:

[A-Z0-9][A-Z0-9_-]* 

指:a序列開始與一個字母數字卡拉科特,任選接着進行的「字」字符的字符串(即,字母數字,劃線和下劃線)。

正則表達式的下位是這樣的:

(?:.[A-Z0-9][A-Z0-9_-]*)+ 

我認爲這是試圖以匹配域部分。所以,如果你有說:

https://mail.google.com 

.google.com位會被這部分匹配。最初的(?:位意在告訴正則表達式引擎不創建「反向引用」。這不是真正的我的據點,也許別人可以解釋。但該組的其他成員非常清晰,與我們之前看到的相似。我認爲有一個錯誤:括號內的字符類之前出現的點(。)通常表示「匹配任何字符」或「匹配任何非換行字符」,而不是「匹配字面點」。通常如果你想要一個字面點,你需要逃避它。這將是JavaScript中的語法和我想的Perl:

(\.[A-Z0-9][A-Z0-9_-]*)+ 

(立即注意反斜槓點前,表示字面點)

正則表達式的最後位似乎試圖匹配端口數量:

:?(d+)? 

但是,d+位可能是錯誤的:現在它符合「一個或多個D的」。它應該是:

:?(\d+)? 

含義:可選地匹配冒號(:),可選地跟一串數字。 \d也是一個角色類,但是是一個預定義的類。我認爲大多數正則表達式引擎使用\d來表示數字,但您應該檢查引擎的文檔以查看確切的約定。所以在說:

http://domain.server.extension:8080/ 

正則表達式的這部分將匹配:8080(提供您修復d +的東西)。 最後,我們看到

/? 

含義整個事情可以由一個斜槓隨後任選。

所以,總而言之,我不認爲這匹配一個「鏈接」,而是匹配一個URL的inital部分。要匹配整個網址,您需要多一點,至少我沒有看到任何可能與正確URL中可能出現的路徑,資源,哈希和查詢位相匹配的表達式。

+0

@Tim heh,自從我使用stackoverflow以來已經有一段時間了。我想這對我的耐心練習技巧是很好的:) – 2012-03-01 21:16:46

+1

你應該得到逆轉徽章。 – 2012-03-01 21:19:51

+0

+1很好的答案。一個小問題,你對':?(d +)?'的解釋是錯誤的。你解釋了它應該是什麼(我想),但實際上它是:匹配一個可選的冒號,然後是一個可選的字母「d」系列。我認爲「d」應該逃脫。 – stema 2012-03-01 21:20:52

2

,這意味着你嘗試過的東西,被卡住的地方?

請問更具體的問題。

我可以給你一些關鍵詞,你可以查找他們更容易,應該是一個不錯的地方是regular-expressions.info

(http|https|ftp)是交替

[A-Z0-9]是一個字符類

*+?是量詞

(...)是一個(捕獲)組,(?:...)是非捕獲組

#的在開始和結束是正則表達式的分隔符,則i在最後是改性劑/選項(匹配的情況下獨立的)。

(d+)?最後會匹配一個或多個(可選)字母「d」。這很奇怪。我認爲它應該是(\d+)?這將是一個或多個(可選)數字。

+0

謝謝你的回答stema – Paul 2012-03-02 07:57:51