正則表達式 - 示例

簡單表達式

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

/a/
/7/
/M/

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

/a7M/

請注意,沒有串聯運算符。隻須在一個字符後麵鍵入另一個字符。

字符匹配

點號 . 匹配字符串中的各種打印或非打印字符,除了換行符 \n\r。下麵的正則表達式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:

/a.c/

若要匹配包含文件名的字符串,而句點 . 是輸入字符串的組成部分,請在正則表達式中的句點前麵加反斜杠 \ 字符。舉例來說明,下麵的正則表達式匹配 filename.ext:

/filename\.ext/

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

一個合理的用戶名正則表達式

用戶名可以包含以下幾種字符:

  • 1、26 個大小寫英文字母表示為 a-zA-Z
  • 2、數字表示為 0-9
  • 3、下劃線表示為 _
  • 4、中劃線表示為 -

用戶名由若幹個字母、數字、下劃線和中劃線組成,所以需要用到 + 表示 1 次或多次出現。

根據以上條件得出用戶名的表達式可以為:

[a-zA-Z0-9_-]+

實例

var str = "abc123-_def"; var patt = /[a-zA-Z0-9_-]+/; document.write(str.match(patt));

以下標記的文本是獲得的匹配的表達式:

abc123-_def

嚐試一下 »

如果不需要中劃線則為:

[a-zA-Z0-9_]+

實例

var str = "abc123def"; var str2 = "abc123_def"; var patt = /[a-zA-Z0-9_]+/; document.write(str.match(patt)); document.write(str2.match(patt));

以下標記的文本是獲得的匹配的表達式:

abc123def
abc123_def

嚐試一下 »

匹配 HTML 標簽及內容

以下正則表達式用於匹配 iframe 標簽:

/<iframe(([\s\S])*?)<\/iframe>/

其他標簽的匹配可以替換 iframe

匹配 id="mydiv" 的 div 標簽:

/<div id="mydiv"(([\s\S])*?)<\/div>/

匹配所有 img 標簽:

實例

/<img.*?src="(.*?)".*?\/?>/gi

嚐試一下 »

中括號表達式

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

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

括在中括號表達式中的字符隻匹配處於正則表達式中該位置的單個字符。以下正則表達式匹配 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 號。
<[a-zA-Z]+.*?>([\s\S]*?)</[a-zA-Z]*?> 匹配 HTML 標記。
正則表達式 描述
hello 匹配 {hello}
gray|grey 匹配 {gray, grey}
gr(a|e)y 匹配 {gray, grey}
gr[ae]y 匹配 {gray, grey}
b[aeiou]bble 匹配 {babble, bebble, bibble, bobble, bubble}
[b-chm-pP]at|ot 匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot}
colou?r 匹配 {color, colour}
rege(x(es)?|xps?) 匹配 {regex, regexes, regexp, regexps}
go*gle 匹配 {ggle, gogle, google, gooogle, goooogle, ...}
go+gle 匹配 {gogle, google, gooogle, goooogle, ...}
g(oog)+le 匹配 {google, googoogle, googoogoogle, googoogoogoogle, ...}
z{3} 匹配 {zzz}
z{3,6} 匹配 {zzz, zzzz, zzzzz, zzzzzz}
z{3,} 匹配 {zzz, zzzz, zzzzz, ...}
[Bb]rainf\*\*k 匹配 {Brainf**k, brainf**k}
\d 匹配 {0,1,2,3,4,5,6,7,8,9}
1\d{10} 匹配 11 個數字,以 1 開頭
[2-9]|[12]\d|3[0-6] 匹配 2 到 36 範圍內的整數
Hello\nworld 匹配 Hello 後跟換行符,後跟 world
\d+(\.\d\d)? 包含一個正整數或包含兩位小數位的浮點數。
[^*@#] 排除 *、@ 、# 三個特色符號
//[^\r\n]*[\r\n] 匹配 // 開頭的注釋
^dog 匹配以 "dog" 開始
dog$ 匹配以 "dog" 結尾
^dog$ is exactly "dog"

更多實例