Regex定義:
直接量,var pattern = /s$/; //與所有以字母"s"結尾的字串匹配
建構函式,var pattern = new RegExp('s$');
直接量字元:
字元 | 匹配
字母數字字元 | 自身
\o | NUL字元(\u0000)
\t | 定位字元(\u0009)
\n | 分行符號(\u000A)
\v | 垂直定位字元(\u000B)
\f | 換頁符(\u000C)
\r | 斷行符號(\u000D)
\xnn | 由十六進位數nn指定的拉丁字元,如: \x0A等價於\n
\uxxxx | 由十六進位數xxxx指定的Unicode字元,如: \u0009等價於\t
\cx | 控制字元^X。如\cJ等價於分行符號\n
字元類:
字元 | 匹配
[...] | 位於括弧內的任一字元
[^...] | 不在括弧內的任一字元
. | 除分行符號和其他Unicode行終止符之外的任一字元
\w | 任何ASCII單字字元,等價於[a-zA-Z0-9]
\W | 任何ASCII非單字字元,等價於[^a-zA-Z0-9]
\s | 任何Unicode空白符
\S | 任何非Unicode空白符
\d | 任何ASCII數字,等價於[0-9]
\D | 任何ASCII數字外的任何字元,等價於[^0-9]
[\b] | 退格直接量(特例)
在方括弧內也可以使用這些特殊字元類逸出序列。如/[\s\d]/匹配任意的空白符或數字。
重複:
字元 | 含義
{n,m} | 匹配前一項至少n次,但不超過m次
{n,} | 匹配前一項n次,或更多次
{n} | 匹配前一項恰好n次
? | 匹配前一項0次或1次,等價於{0,1}
+ | 匹配前一項1次或多次,等價於{1,}
* | 匹配前一項0次或多次,等價於{0,}
注意*和?,由於這些字元可能匹配前面字元的0個執行個體,所以它們允許什麼都不匹配,如/a*/可以與"bbbb"匹配,因為它含有0個a。
重複字元可以匹配儘可能多的字元,而且允許接下來的Regex繼續匹配,可以說重複是“貪婪的”。但我們也可以以非貪婪的方式進行重複,只需要在重複字元後加問好即可。
選擇、分組和引用:
字元 | 含義
| | 選擇。匹配的是該富豪左邊的子運算式或右邊的子運算式
(...) | 組合。將幾個公事包為一個單元,這個單元可以由*、+和?等符號使用,還可以記住和這個組合匹配的字元以供此後的引用使用
(?:...) | 只組合。把公事包到一個單元,但不記憶與該組合匹配的字元。
\n | 和第n個分組第一次匹配的字元相匹配。組是括弧中的子運算式(可能是嵌套的)。組號是從左至右計數的左括弧數,以(?:形式分組的組不編碼
Regex的文法還包括指定選擇項、對子運算式分組和引用前一子運算式的特殊字元。
字元"|"用於分隔供選擇的字元。如:/ab|cd|ef/匹配字串"ab",或"cd",或"ef"。選擇項是從左至右考慮,直到發現匹配項。如果左邊的選擇項匹配,就忽略右邊的匹配項。在應用中要注意把更好的匹配放在正則式的左邊。
括弧在Regex中的作用有幾種。
一種是把單獨的公事包成子運算式,以便可以像處理一個獨立的單元那樣用|、*、+或?等來處理它們。如/java(script)?/匹配"java"其後可以有也可以沒有"script";
另一種是在完整的模式中定義子模式。當一個Regex成功地和目標字串匹配時,可以從目標串中抽出和括弧中的子模式相匹配的部分(之後詳述);
第三種是允許我們在同一Regex後部引用前面的子運算式,這是通過在字元"\"後加一位或多位元字實現的。數字指定了帶括弧的子運算式在正則式中的位
置。如\n引用的是第n個帶括弧的運算式。需要注意的是,由於子運算式可以被嵌套在別的子運算式中,所以它的位置是被計數的左括弧的位置。對Regex中
前一子運算式的引用所指的並不是那個子運算式的模式,而是與那個模式相匹配的文本。如我們在用Regex匹配單引號或雙引號時,可以用\n的方法來進行約
束。
在JavaScript1.5中,無須建立帶編碼的引用就可以將Regex中的項目進行組合。它是以(?和)來分組。
指定匹配的位置:
字元 | 含義
^ | 匹配字串的開頭,在多行檢索中,匹配一行的開頭
$ | 匹配字串的結尾,在多行檢索中,匹配一行的結尾
\b | 匹配一個詞語的邊界。也就是位於字元\w和\W之間的位置,或位於 字元\w和字串開頭或結尾之間的位置(注意區分[\b])
\B | 匹配非詞語邊界的字元
(?=) | 正前向聲明,要求接下來的字元都與模式p匹配,但是不包括匹配中 的那些字元
(?!p) | 反前向聲明,要求接下來的字元不與模式p匹配
標誌:
Regex的標誌,說明進階模式比對規則。它是在"/"符號之外說明的,位於第二個斜杠之後。
JavaScript1.2支援兩個標誌,標誌i說明模式比對應該是大小寫不敏感的字元,標誌g說明模式比對應該是全域的,即要找出被檢索字串中所以的匹配。
JavaScript1.5還支援標誌m,它以多行模式執行模式比對。在這種模式中,如果要檢索的字串中含有分行符號,^和$錨除了匹配字串的開頭和結尾外,還匹配每行的開頭和結尾。
用於模式比對的String方法
search()方法:該方法以Regex為參數,返回第一個與之匹配的子串的開始字元的位置,如果沒有任何匹配的子串,返回-1。如果參數不是正則表
達式,它首先將被傳遞給RegExp建構函式,轉換成Regex。search()方法不支援全域檢索,因為它忽略了Regex參數的標誌g。
replace()方法:執行檢索和替換操作。它的第一個參數是一個Regex,第二個參數是要進行替換的字串。如果Regex中設定了標誌g,該方
法將用替換字串替換被檢索的字串中所有與模式比對的子串。否則只替換髮現的第一個與模式比對的子串。如果第一個參數是字串,而不是Regex,它將
直接檢索那個字串,而不用RegExp()建構函式將它轉換成Regex。
replace()方法的更強用法是,由於Regex中用括弧括起來的子運算式是從左至右進行編號的,而且Regex會記住與每個子運算式匹配的文本。如果在替換字串中出現了符號$加數字,那麼replace()將用與指定的子運算式相匹配的文本來替換這兩個字元。
而且,replace()方法的第二個參數還可以是函數,該函數能夠動態計算替換字串。
match()方法:它的參數是一個Regex(或把它的參數傳遞個RexExp()函數以轉換成Regex),返回包含了匹配結果的數組。如果該正則
運算式有標誌g,該方法返回的數組包含的就是出現在字串中的所有匹配。否則,只檢索第一個匹配。但是,即使match()執行的不是全域檢索,它也返回
一個數組。在這種情況下,數組的第一個元素就是匹配的字串,而餘下的元素則是運算式中用括弧括起來的子運算式。因此,如果match()返回了一個數組
a,那麼a[0]存放的是完整的匹配,a[1]存放的是與第一個括弧括起來的運算式匹配的子串,依次類推。為了和replace()方法保持一致,a
[n]存放的是$n的內容。
此外,match()方法返回的數組具有length、index和input屬性。其中index包含的是字串中匹配開始處的字元的位置,後者則是目標字串的一個副本。
split()方法:這個方法可以把調用它的字串分解為一個子串數組,使用的分隔字元是它的參數。如果split()方法使用Regex作為參數,就可以有一個非常強大的分解方式。
RegExp對象
建構函式RegExp()有兩個字串參數,其中第二個參數是可選的,它們是"g"、"i"、"m"的組合。第一個參數是包含Regex主體的字串,也就是Regex直接量中出現斜線之間的文本。
RegExp對象定義了兩個用於執行模式比對操作的方法。
exec()方法與String的match()方法相似,它是以字串為參數的RegExp方法。exec()方法對一個指定的字串執行一個正則表
達式,也就是在一個字串中檢索匹配。如果沒有匹配返回null,如果找到匹配返回一個數組。結果與match()方法的非全域檢索返回的數組一樣,而不
管Regex中是否具有全域屬性g。