JavaScript 正則表達式的使用

版權聲明:本文由吳仙傑創做整理,轉載請註明出處:http://www.javashuo.com/article/p-vtsvtzrl-kk.htmljavascript

1. 引言

正則表達式自己語法是一致,只是各編程語法對正則表達式的語法表現些區別。java

本文主要是關於正則在 JavaScript 中的使用。若你對正則自己還不是很瞭解的話,強烈推薦先閱讀個人上一篇正則文章——《Java 正則表達式詳解》。正則表達式

2. 建立正則表達式

在 JavaScript 中,咱們有兩種建立正則表達式的方式。編程

方式一,使用正則表達式字面量,它由兩個斜槓包裹,以下所示:segmentfault

var re = /ab+c/;

正則表達式字面量會在腳本加載後編譯。當正則表達式是靜態不變的,那麼使用這種方式將會得到更好的性能。數組

方式二,調用 RegExp 對象的構造方法,以下所示:app

var re = new RegExp('ab+c');

或:ide

var re = new RegExp(/ab+c/);

在使用構造方法時,正則表達式是在運行時編譯的,適合正則表達式會動態改變的狀況下使用。性能

3. 編寫正則表達式

3.1 特殊字符

特殊字符 含義
\ 轉義字符。反斜槓能夠將後面跟着的第一個普通字符進行變成表示特殊含義的特殊字符。好比:/b/ 表示匹配一個小寫字母 "b",可是 /\b/ 卻不匹配任何字符,它變成了一個邊界字符。反斜槓也能夠將後面跟着的第一個特殊字符變成普通字符。好比: /a*/ 表示匹配 0 個或多個 "a",可是 /a\*/ 表示匹配 "a*"。
^ 表示匹配字符串的開頭。 在多行模式下,表示匹配每行的開頭。 ^ 若是出如今集合中的第一個字符,那麼它的含義表示否認,好比:[^ab] 表示匹配不是 "a"或 "b" 的字符。
$ 表示匹配字符串的結束。 在多行模式下,表示 匹配每行的結束。
* 表示匹配前面的模式 0 次或屢次,等同於 /{0,}/
+ 表示匹配前面的模式 1 次或屢次,等同於 /{1,}/
? 表示匹配前面的模式 0 次或 1 次,等同於 {0,1}。 若是 ? 是限定符 *+?{} 後面的第一個字符,那麼表示非貪婪模式(儘量少的匹配字符),而不是默認的貪婪模式? 也可以使用在先行斷言(lookahead)模式中。好比:此表格中的 x(?=y)x(?!y)
. 表示匹配一個除了換行符外的任意字符。
(x) 表示匹配分組 x,並保存匹配結果(反向引用(back references)),這組小括號被稱爲捕獲括號(capturing parentheses)。好比:對於字符串 "good bad good bad" 的匹配模式 /(good) (bad) \1 \2/ 中,(good)(bad) 分別匹配第一個和第二個單詞同時生成對應組的反向引用,其中 \1\2 分別匹配最後兩個單詞(但不生成反向引用)。對於 \1\2\n,是用來匹配正則表達式的一部分。在以正則表達式替換字符串的語法中,$1$2$n 分別表示組一的反向引用、組二的反向引用、組 n 的反向引用,其中 $& 表示匹配全部分組的字符(注意在 Java 中,是用 $0 表示)。好比:console.log('good bad good bad'.replace(/(good)\s(bad)/, '$1-$2')) 的結果爲 "good-bad good bad"。
(?:x) 表示匹配分組 x 但不產生反向引用,這組小括號被稱爲非捕獲括號,但可使咱們定義正則表達式的子表達式。好比:對於 /foo{1,2}/ 中的 {1,2} 表示匹配最後的字符 'o' 一次到兩次。對於 (?:foo){1,2} 中的 {1,2} 表示匹配一組字符 "foo" 一次到兩次。
x(?=y) 表示只匹配後面緊跟着分組 y 的字符 x ,這種模式稱爲先行斷言(lookahead)。好比:Jack(?=Sprat|Frost) 表示只匹配後面跟着 "Sprat" 或 "Frost" 的 "Jack"。
x(?!y) 表示只匹配後面不是緊跟着分組 y 的字符 x,這模式稱爲否認先行斷言(lookahead)。好比:/\d+(?!\.)/ 表示匹配沒有小數點的數字。
x|y 表示匹配 x 或 y。
{n} 表示匹配前面的模式 n 次。
{n,m} 表示匹配前面的模式最少 n 次,最多 m 次。當不指定 m 時,至關於無空大。
[xyz] 字符集。表示匹配方括號中指定的任何一個字符,包括轉義字符。其中特殊字符,如小數點 . 和星號 * 在字符集中不是特殊字符,所以不用轉義。在方括號中,可使用連字符 - 來指定字符範圍。
[^xyz] 否認字符集。表示匹配不在方括號中指定的任何一個字符。可使用 - 來指定字符範圍。特殊字符的狀況和 [xyz] 相同。
[\b] 表示匹配退隔符(backspace)。注意:不要和 \b 混淆。
\b 表示匹配字邊界。字邊界是指某個字符的前面和後面都沒有其它單詞字符(好比除了字符開始 或 字符結束 或 '.' 或 ',' 或 空格 等)。注意:匹配的字符邊界不在匹配結果內,同時不要和 [\b] 混淆。好比:/\bm/ 匹配 'moon' 中的 'm'。
\B 表示匹配非字邊界。
\d 表示匹配一個數字字符。至關於 [0-9]
\D 表示匹配一個非數字字符。至關於 [^0-9]
\s 表示匹配一個空格字符,包括 space, tab, form feed, line feed。至關於 [ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S 表示匹配一個非空格字符。
\t 表示匹配一個 tab 字符。
\w 表示匹配一個數字或大小寫字母或下劃線。至關於 [A-Za-z0-9_]
\W 表示匹配一個非數字或大小寫字母或下劃線的字符。至關於 [^A-Za-z0-9_]
\n n 是一個正整數。一個反向引用(back reference),指向正則表達式中第 n 個括號(從左開始數)中匹配的子字符串。好比:正則表達式 apple(,)\sorange\1 匹配字符串 "apple, orange, cherry, peach." 中的字符 "apple, orange,"。
\uhhhh 表示匹配一個 unicode 編碼(四個十六進制的數字)爲 'hhhh'的字符。

4. 使用正則表達式

在 JavaScript 中,正則表達式是經過 RegExp 對象的 testexec 方法以及字符串 String 內置的 searchmatchreplacesplit 方法使用的。ui

方法 描述
test RegExp 的一個根據正則驗證字符串是否有存在匹配項的方法。匹配成功返回 true,反之返回 false。
exec RegExp 的一個根據正則檢索字符串全部匹配項的方法,如有匹配的項則返回 array 數組對象,沒有匹配項則返回 null。
search 字符串內置的一個根據正則驗證字符串是否存在匹配項的方法。匹配成功返回匹配項的開始索引 index,反之返回 -1。
match 字符串內置的一個根據正則檢索字符串全部匹配項的方法,如有匹配的項則返回 array 數組對象,沒有匹配項則返回 null。
replace 字符串內置的一個根據正則替換字符串匹配項的方法。返回替換後的字符串。
split 字符串內置的一個根據正則或精確的字符切片字符的方法。返回字符串數組 array 對象。

當須要驗證字符串是否存在某種模式的時候用 testsearch 方法;當須要按某種模式截取字符串時用 execmatch 方法。

4.1 exec 和 match 的示例方法

下面的代碼,使用了 exec 獲取匹配的字符數組對象:

var myRe = /d(b+)d/g;
var myArray = myRe.exec('cdbbdbsbz');

console.log('myArray', myArray); // 結果數組
console.log('myRe', myRe); // 正則
console.log('myRe.lastIndex', myRe.lastIndex); // 下一個匹配開始時的索引
console.log('myRe.source', myRe.source); // 匹配模式文本

若是不須要訪問正則表達式的屬性,另外一種寫法爲:

var myArray = /d(b+)d/g.exec('cdbbdbsbz'); 

console.log('myArray', myArray); // 結果數組
console.log('myRe', myRe); // 正則
console.log('myRe.lastIndex', myRe.lastIndex); // 下一個匹配開始時的索引
console.log('myRe.source', myRe.source); // 匹配模式文本

若是要經過構造方法建立正則,以下:

var myRe = new RegExp('d(b+)d', 'g');
var myArray = myRe.exec('cdbbdbsbz');

console.log('myArray', myArray); // 結果數組
console.log('myRe', myRe); // 正則
console.log('myRe.lastIndex', myRe.lastIndex); // 下一個匹配開始時的索引
console.log('myRe.source', myRe.source); // 匹配模式文本

運行結果:

圖片描述

下面調用字符串內置的 match 方法:

var myRe = /d(b+)d/g;
var myArray = 'cdbbdbsbz'.match(myRe);

console.log('myArray', myArray); // 結果數組
console.log('myRe', myRe); // 正則
console.log('myRe.lastIndex', myRe.lastIndex); // 下一個匹配開始時的索引
console.log('myRe.source', myRe.source); // 匹配模式文本

運行結果:

圖片描述

總結:對於 RegExp 的方法 exec 匹配成功時,會返回該數組並更新正則的全局檢索屬性(lastIndex);而字符串的方法 match 則不會更新全局檢索屬性。

4.2 分組與反向引用

對於正則表達式中的小括號會進行模式分組同時生成保存小括號匹配項的反向引用。好比:

var re = /(\w+)\s(\w+)/;
var str = 'John Smith';
var newstr = str.replace(re, '$2, $1');
console.log(newstr); // 運行結果:Smith, John

4.3 高級搜索與標誌(flags)

正則表達式有五個可選標誌,好比,容許全局和不區分大小寫的匹配模式。這些標誌能夠以任何順序單獨使用或一塊兒使用,並做爲正則表達式的一部分。

標誌(flags) 描述
g global,全局匹配(找到全部匹配,而不是在第一個匹配後中止)。
i insensitive,不區分大小寫的匹配([a-zA-Z])。
m multi line,多行匹配,使 ^$ 匹配每行的開始和結束(不單單表示字符串的開始和結束)。
u unicode,將模式視爲 Unicode 序列。
y sticky,強制模式從上一次匹配後的索引位開始匹配。

使用語法:

var re = /pattern/flags;

或者:

var re = new RegExp('pattern', 'flags');

5. 參考

Regular Expressions

相關文章
相關標籤/搜索