天天看點

正規表達式 - 示例

簡單表達式

正規表達式的最簡單形式是在搜尋字元串中比對其本身的單個普通字元。例如,單字元模式,如 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 标記。