正則運算式 - 示例
簡單運算式
正則運算式的最簡單形式是在搜索字串中匹配其本身的單個普通字元。例如,單字符模式,如 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 標記。 |