很多Web開發人員在忽視正則表達式之後,還可以順利的工作,但很多情況下,一句正確的正則表達式,很有可能省略半屏的代碼。 正則表達式的解釋 術語與操作符 匹配一類字元 釋義 重覆出現 預定義字元類 分組 或操作符 反向引用 編譯正則表達式 捕獲匹配的片段 正則表達式的解釋 在JavaScript中,與
很多Web開發人員在忽視正則表達式之後,還可以順利的工作,但很多情況下,一句正確的正則表達式,很有可能省略半屏的代碼。
正則表達式的解釋
在JavaScript中,與大多數其他對象類型一樣,有兩種方法可以創建正則表達式:通過正則表達式字面量,或者通過構造RegExp對象的實例。
例如,如果要創建一個一般的正則表達式,用於精確匹配字元創“test”,可以使用正則字面量:
var pattern=/test/;
正斜杠可能看著有些奇怪,但是正如字元創是用引號進行界定一樣,正則字面量是用正斜杠進行界定的。
或者,我們可以構造一個RegExp實例,將正則表達式作為字元串傳入:
var pattern=new RegExp("test");
在開發過程中,如果正則是已知的,則優先選擇字面量語法,而構造器方式則是用於在運行時,通過動態構建字元串來構建正則表達式。字面量語法優先於字元串的其中一個原因是反斜杠字元在普通字元串中也是一個轉義字元,多以,我們要用\\來表示反斜杠。
除了表達式本身,還有三個標誌可以與正則進行關聯:
-
i:讓正則表達式不區分大小寫。
-
g:匹配模式中的所有實例,而不是預設只匹配第一次出現的結果。
-
m:允許匹配多個行。
這些標誌將附加到字面量尾部(/test/ig)或者作為RegExp的第二個字元參數。
術語與操作符
匹配一類字元
-
[abc]:匹配a,b,c中的任何一個字元。
-
[^abc]:匹配除a,b,c以外的任意字元。
-
[a-m]:匹配從a到m的所有字元。
釋義
-
/^test/:以test開頭的字元串
-
/test$/:表示該模式必須出現在字元串的結尾
重覆出現
-
/t?est/:該字元t可出現0次或1次
-
/t+est/:該字元t可出現1次或多次
-
/t*est/:該字元t可出現0次或多次
-
/a{4}/:該字元出現4次
-
/a{4,10}/:包含連續4個至10個a字元的字元串
這些重覆操作符可以是貪婪的也可以是非貪婪的,預設為貪婪的:匹配所有字元組合。在操作符後邊加一個問號?字元,如a+?,可以讓該表達式成為非貪婪的:進行最小限度的匹配。
預定義字元類
預定義術語 | 匹配內容 |
---|---|
\t | 水平製表符 |
\b | 空格 |
\v | 垂直製表符 |
\f | 換頁符 |
\r | 回車 |
\n | 換行符 |
. | 匹配除了新行之外的任意字元 |
\d | 匹配任意數字,等價於[0~9] |
\D | 匹配任意非數字,定價與[^0~9] |
\w | 匹配包括下劃線的任意單詞字元,等價於[A-Za-z0-9_] |
\W | 匹配任意非單詞字元,等價於[^A-Za-z0-9_] |
\s | 匹配任何空白字元,包括空格,製表符,換頁符等 |
\S | 匹配任意非空白字元 |
\b | 匹配單詞邊界 |
\B | 匹配非單詞邊界 |
分組
如果將操作符應用於一組術語,可以像數學表達式一樣在改組上使用小括弧。例如:/(ab)+/匹配一個或多個連續出現的子字元串“ab”
或操作符
可以用|字元表示或者的關係。例如/(ab)+|(cd)+/匹配出現一次或多次的“ab”或“cd”。
反向引用
這種術語表示法是在反斜杠後面加一個要引用的捕獲數量,該數字從1開始,如\1、\2等。
例如:/^([dtn])a\1/匹配任意一個以d,t或者n開頭,且後邊跟著一個a字元,並且再後邊跟著的是和第一個捕獲相同字元的字元串。因此\1匹配的字元需要在執行的時候才能確定。
在匹配XML類型的標記元素的時候它很有用,例如/<(\w+)>(.+)</\1>/,可以匹配像“<strong>shtat</strong>”這樣的元素。
編譯正則表達式
正則表達式的兩個重要階段是編譯和執行,編譯發生在正則表達式第一次被創建時,而執行發生在我們使用編譯過的正則表達式進行字元串匹配的時候。
正則表達式只創建一次,並將其保存在一個變數中供後續使用,這是一個重要的優化過程。
捕獲匹配的片段
簡單匹配一個字元創是否匹配一個模式顯然是我們需要做的第一步,但在很多情況下,確定匹配的內容也是很有用的。
(未完待續)