正則表示式 – 示例

正則表示式 - 示例

簡單表示式

正則表示式的最簡單形式是在搜尋字串中匹配其本身的單個普通字元。例如,單字元模式,如 A,不論出現在搜尋字串中的何處,它總是匹配字母 A。下面是一些單字元正則表示式模式的示例:

/a/
/7/
/M/

可以將許多單字元組合起來以形成大的表示式。例如,以下正則表示式組合了單字元表示式:a、7 和 M。

/a7M/

請注意,沒有串聯運算子。只須在一個字元後面鍵入另一個字元。

字元匹配

句點 (.) 匹配字串中的各種列印或非列印字元,只有一個字元例外。這個例外就是換行符 (\n)。下面的正則表示式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:

/a.c/

若要匹配包含檔名的字串,而句點 (.) 是輸入字串的組成部分,請在正則表示式中的句點前面加反斜槓 (\) 字元。舉例來說明,下面的正則表示式匹配 filename.ext:

/filename\.ext/

這些表示式只讓您匹配"任何"單個字元。可能需要匹配列表中的特定字元組。例如,可能需要查詢用數字表示的章節標題(Chapter 1、Chapter 2 等等)。

中括號表示式

若要建立匹配字元組的一個列表,請在方括號([ 和 ])內放置一個或更多單個字元。當字元括在中括號內時,該列表稱為"中括號表示式"。與在任何別的位置一樣,普通字元在中括號內表示其本身,即,它在輸入文字中匹配一次其本身。大多數特殊字元在中括號表示式內出現時失去它們的意義。不過也有一些例外,如:

  • 如果 ] 字元不是第一項,它結束一個列表。若要匹配列表中的 ] 字元,請將它放在第一位,緊跟在開始 [ 後面。
  • \ 字元繼續作為轉義符。若要匹配 \ 字元,請使用 \\。

括在中括號表示式中的字元只匹配處於正則表示式中該位置的單個字元。以下正則表示式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5:

/Chapter [12345]/

請注意,單詞 Chapter 和後面的空格的位置相對於中括號內的字元是固定的。中括號表示式指定的只是匹配緊跟在單詞 Chapter 和空格後面的單個字元位置的字符集。這是第九個字元位置。

若要使用範圍代替字元本身來表示匹配字元組,請使用連字元 (-) 將範圍中的開始字元和結束字元分開。單個字元的字元值確定範圍內的相對順序。下面的正則表示式包含範圍表示式,該範圍表示式等效於上面顯示的中括號中的列表。

/Chapter [1-5]/

當以這種方式指定範圍時,開始值和結束值兩者都包括在範圍內。注意,還有一點很重要,按 Unicode 排序順序,開始值必須在結束值的前面。

若要在中括號表示式中包括連字元,請採用下列方法之一:

  • 用反斜槓將它轉義:
    [\-]
  • 將連字元放在中括號列表的開始或結尾。下面的表示式匹配所有小寫字母和連字元:
    [-a-z]
    [a-z-]
    
  • 建立一個範圍,在該範圍中,開始字元值小於連字元,而結束字元值等於或大於連字元。下面的兩個正則表示式都滿足這一要求:
    [!--]
    [!-~]
    

若要查詢不在列表或範圍內的所有字元,請將插入符號 (^) 放在列表的開頭。如果插入字元出現在列表中的其他任何位置,則它匹配其本身。下面的正則表示式匹配1、2、3、4 或 5 之外的任何數字和字元:

/Chapter [^12345]/

在上面的示例中,表示式在第九個位置匹配 1、2、3、4 或 5 之外的任何數字和字元。這樣,例如,Chapter 7 就是一個匹配項,Chapter 9 也是一個匹配項。

上面的表示式可以使用連字元 (-) 來表示:

/Chapter [^1-5]/

中括號表示式的典型用途是指定任何大寫或小寫字母或任何數字的匹配。下面的表示式指定這樣的匹配:

/[A-Za-z0-9]/

替換和分組

替換使用 | 字元來允許在兩個或多個替換選項之間進行選擇。例如,可以擴充套件章節標題正則表示式,以返回比章標題範圍更廣的匹配項。但是,這並不象您可能認為的那樣簡單。替換匹配 | 字元任一側最大的表示式。

您可能認為,下面的表示式匹配出現在行首和行尾、後面跟一個或兩個數字的 Chapter 或 Section:

/^Chapter|Section [1-9][0-9]{0,1}$/

很遺憾,上面的正則表示式要麼匹配行首的單詞 Chapter,要麼匹配行尾的單詞 Section 及跟在其後的任何數字。如果輸入字串是 Chapter 22,那麼上面的表示式只匹配單詞 Chapter。如果輸入字串是 Section 22,那麼該表示式匹配 Section 22。

若要使正則表示式更易於控制,可以使用括號來限制替換的範圍,即,確保它只應用於兩個單詞 Chapter 和 Section。但是,括號也用於建立子表示式,並可能捕獲它們以供以後使用,這一點在有關反向引用的那一節講述。通過在上面的正則表示式的適當位置新增括號,就可以使該正則表示式匹配 Chapter 1 或 Section 3。

下面的正則表示式使用括號來組合 Chapter 和 Section,以便表示式正確地起作用:

/^(Chapter|Section) [1-9][0-9]{0,1}$/

儘管這些表示式正常工作,但 Chapter|Section 周圍的括號還將捕獲兩個匹配字中的任一個供以後使用。由於在上面的表示式中只有一組括號,因此,只有一個被捕獲的"子匹配項"。

在上面的示例中,您只需要使用括號來組合單詞 Chapter 和 Section 之間的選擇。若要防止匹配被儲存以備將來使用,請在括號內正則表示式模式之前放置 ?:。下面的修改提供相同的能力而不儲存子匹配項:

/^(?:Chapter|Section) [1-9][0-9]{0,1}$/

除 ?: 元字元外,兩個其他非捕獲元字元建立被稱為"預測先行"匹配的某些內容。正向預測先行使用 ?= 指定,它匹配處於括號中匹配正則表示式模式的起始點的搜尋字串。反向預測先行使用 ?! 指定,它匹配處於與正則表示式模式不匹配的字串的起始點的搜尋字串。

例如,假設您有一個文件,該文件包含指向 Windows 3.1、Windows 95、Windows 98 和 Windows NT 的引用。再進一步假設,您需要更新該文件,將指向 Windows 95、Windows 98 和 Windows NT 的所有引用更改為 Windows 2000。下面的正則表示式(這是一個正向預測先行的示例)匹配 Windows 95、Windows 98 和 Windows NT:

/Windows(?=95 |98 |NT )/

找到一處匹配後,緊接著就在匹配的文字(不包括預測先行中的字元)之後搜尋下一處匹配。例如,如果上面的表示式匹配 Windows 98,將在 Windows 之後而不是在 98 之後繼續搜尋。

其他示例

下面列出一些正則表示式示例:

正則表示式 描述
/\b([a-z]+) \1\b/gi 一個單詞連續出現的位置。
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 將一個URL解析為協議、域、埠及相對路徑。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章節的位置。
/[-a-z]/ a至z共26個字母再加一個-號。
/ter\b/ 可匹配chapter,而不能匹配terminal。
/\Bapt/ 可匹配chapter,而不能匹配aptitude。
/Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,當找到一個匹配後,從Windows後面開始進行下一次的檢索匹配。
/^\s*$/ 匹配空行。
/\d{2}-\d{5}/ 驗證由兩位數字、一個連字元再加 5 位數字組成的 ID 號。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 標記。