本文轉自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExphtml
RegExp
構造函數建立了一個正則表達式對象,用於將文本與一個模式匹配。git
有關正則表達式的介紹,請閱讀 JavaScript指南中的正則表達式章節。github
字面量, 構造函數和工廠符號都是能夠的:web
/pattern/flags new RegExp(pattern [, flags]) RegExp(pattern [, flags])
pattern
flags
若是指定,標誌能夠具備如下值的任意組合:正則表達式
g
i
m
y
有兩種方法來建立一個RegExp對象:一是字面量、二是構造函數。要指示字符串,字面量的參數不使用引號,而構造函數的參數使用引號。所以,如下表達式建立相同的正則表達式:express
/ab+c/i; new RegExp('ab+c', 'i'); new RegExp(/ab+c/, 'i');
當表達式被賦值時,字面量形式提供正則表達式的編譯(compilation)狀態,當正則表達式保持爲常量時使用字面量。例如當你在循環中使用字面量構造一個正則表達式時,正則表達式不會在每一次迭代中都被從新編譯(recompiled)。數組
而正則表達式對象的構造函數,如 new RegExp('ab+c')
提供了正則表達式運行時編譯(runtime compilation)。若是你知道正則表達式模式將會改變,或者你事先不知道什麼模式,而是從另外一個來源獲取,如用戶輸入,這些狀況均可以使用構造函數。瀏覽器
從ECMAScript 6開始,當第一個參數爲正則表達式而第二個標誌參數存在時,new RegExp(/ab+c/, 'i')再也不拋出TypeError
(「當從其餘正則表達式進行構造時不支持標誌」)的異常,取而代之,將使用這些參數建立一個新的正則表達式。數據結構
當使用構造函數創造正則對象時,須要常規的字符轉義規則(在前面加反斜槓 \)。好比,如下是等價的:app
var re = new RegExp("\\w+"); var re = /\w+/;
字符類別(Character Classes) | |
---|---|
字符 | 含義 |
. |
(點號,小數點) 匹配任意單個字符,可是行結束符除外: 在字符集中,點( . )失去其特殊含義,並匹配一個字面點( . )。 須要注意的是, 例如, |
\d |
匹配任意阿拉伯數字。等價於 例如, |
\D |
匹配任意一個不是阿拉伯數字的字符。等價於 例如, |
\w |
匹配任意來自基本拉丁字母表中的字母數字字符,還包括下劃線。等價於 例如, |
\W |
匹配任意不是基本拉丁字母表中單詞(字母數字下劃線)字符的字符。等價於 例如, |
\s |
匹配一個空白符,包括空格、製表符、換頁符、換行符和其餘 Unicode 空格。 等價於 例如 |
\S |
匹配一個非空白符。等價於 例如, |
\t |
匹配一個水平製表符(tab) |
\r |
匹配一個回車符(carriage return) |
\n |
匹配一個換行符(linefeed) |
\v |
匹配一個垂直製表符(vertical tab) |
\f |
匹配一個換頁符(form-feed) |
[\b] |
匹配一個退格符(backspace)(不要與 \b 混淆) |
\0 |
匹配一個 NUL 字符。不要在此後面跟小數點。 |
\cX |
例如, |
\xhh |
匹配編碼爲 hh (兩個十六進制數字)的字符。 |
\uhhhh |
匹配 Unicode 值爲 hhhh (四個十六進制數字)的字符。 |
\ |
對於那些一般被認爲字面意義的字符來講,表示下一個字符具備特殊用處,而且不會被按照字面意義解釋。 例如 或 對於那些一般特殊對待的字符,表示下一個字符不具備特殊用途,會被按照字面意義解釋。 例如,* 是一個特殊字符,表示匹配某個字符 0 或屢次,如 |
字符集合(Character Sets) | |
字符 | 含義 |
[xyz] |
一個字符集合,也叫字符組。匹配集合中的任意一個字符。你可使用連字符'-'指定一個範圍。 例如,[abcd] 等價於 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。 |
[^xyz] |
一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也能夠經過使用連字符 '-' 指定一個範圍內的字符。 例如, |
邊界(Boundaries) | |
字符 | 含義 |
^ |
匹配輸入開始。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符後的開始處。 例如, |
$ |
匹配輸入結尾。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符的前的結尾處。 例如, |
\b |
匹配一個零寬單詞邊界(zero-width word boundary),如一個字母與一個空格之間。 (不要和 例如, |
\B |
匹配一個零寬非單詞邊界(zero-width non-word boundary),如兩個字母之間或兩個空格之間。 例如, |
分組(Grouping)與反向引用(back references) | |
字符 | 含義 |
(x) |
匹配 例如, 捕獲組(Capturing groups)有性能懲罰。若是不需再次訪問被匹配的子字符串,最好使用非捕獲括號(non-capturing parentheses),見下面。 |
\n |
例如, |
(?:x) |
匹配 x 不會捕獲匹配項。這被稱爲非捕獲括號(non-capturing parentheses)。匹配項不可以從結果數組的元素 [1], ..., [n] 或已被定義的 RegExp 對象的屬性 $1, ..., $9 再次訪問到。 |
數量詞(Quantifiers) | |
字符 | 含義 |
x* |
匹配前面的模式 x 0 或屢次。 例如, |
x+ |
匹配前面的模式 x 1 或屢次。等價於 例如, |
x*? x+? |
像上面的 * 和 + 同樣匹配前面的模式 x,然而匹配是最小可能匹配。 例如, |
x? |
匹配前面的模式 x 0 或 1 次。 例如, 若是在數量詞 在使用於向前斷言(lookahead assertions)時,見該表格中 |
x(?=y) |
只有當 x 後面緊跟着 y 時,才匹配 x 。 例如,/Jack(?=Sprat)/ 只有在 'Jack' 後面緊跟着 'Sprat' 時,纔會匹配它。/Jack(?=Sprat|Frost)/ 只有在 'Jack' 後面緊跟着 'Sprat' 或 'Frost' 時,纔會匹配它。然而,'Sprat' 或 'Frost' 都不是匹配結果的一部分。 |
x(?!y) |
只有當
|
x|y |
匹配 例如, |
x{n} |
例如, |
x{n,} |
例如, |
x{n,m} |
例如, |
斷言(Assertions) | |
字符 | 含義 |
x(?=y) |
僅匹配被y跟隨的x。 舉個例子,
|
x(?!y) |
僅匹配不被y跟隨的x。 舉個例子, |
[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
RegExp.prototype
RegExp.length
值爲 2。
RegExp
自身沒有方法, 不過它會繼承一些方法經過原型鏈
注意,RegExp
對象的幾個屬性既有完整的長屬性名,也有對應的類 Perl 的短屬性名。兩個屬性都有着一樣的值。JavaScript 的正則語法就是基於 Perl 的。
RegExp.prototype.
constructor
RegExp.prototype.global
RegExp.prototype.ignoreCase
RegExp.prototype.lastIndex
RegExp.prototype.multiline
RegExp.prototype.source
RegExp.prototype.sticky
Object
:
RegExp.prototype.exec()
RegExp.prototype.test()
RegExp.prototype.toSource()
Object.prototype.toSource
方法.
RegExp.prototype.toString()
Object.prototype.toString()
方法。
Object
:
下例使用 replace
方法 (繼承自 String
)去匹配姓名 first last 輸出新的格式 last, first。腳本中使用 $1 和
$2
指明括號裏先前的匹配.
var re = /(\w+)\s(\w+)/; var str = "John Smith"; var newstr = str.replace(re, "$2, $1"); print(newstr);
顯示 "Smith, John".
var s = "Please yes\nmake my day!"; s.match(/yes.*day/); // Returns null s.match(/yes[^]*day/); // Returns 'yes\nmake my day'
該例展現了,如何在正則表達式上使用 sticky 標誌,用來匹配多行輸入的單獨行。
var text = "First line\nsecond line"; var regex = /(\S+) line\n?/y; var match = regex.exec(text); print(match[1]); // prints "First" print(regex.lastIndex); // prints 11 var match2 = regex.exec(text); print(match2[1]); // prints "Second" print(regex.lastIndex); // prints "22" var match3 = regex.exec(text); print(match3 === null); // prints "true"
可使用 try { … } catch { … }
來測試運行時(run-time)是否支持 sticky
標誌。這種狀況下,必須使用 eval(…)
表達式或 RegExp(regex-string, flags-string)
語法(這是因爲 /regex/flags
表示法將會在編譯時刻被處理,所以在 catch
語句塊處理異常前就會拋出一個異常。例如:
var supports_sticky; try { RegExp('','y'); supports_sticky = true; } catch(e) { supports_sticky = false; } alert(supports_sticky); // alerts "false" in Firefox 2, "true" in Firefox 3+
正如上面表格提到的,\w
或 \W
只會匹配基本的 ASCII 字符;如 'a' 到 'z'、 'A' 到 'Z'、 0 到 9 及 '_'。爲了匹配其餘語言中的字符,如西里爾(Cyrillic)或 希伯來語(Hebrew),要使用 \uhhhh
,"hhhh" 表示以十六進制表示的字符的 Unicode 值。下例展現了怎樣從一個單詞中分離出 Unicode 字符。
var text = "Образец text на русском языке"; var regex = /[\u0400-\u04FF]+/g; var match = regex.exec(text); print(match[1]); // prints "Образец" print(regex.lastIndex); // prints "7" var match2 = regex.exec(text); print(match2[1]); // prints "на" [did not print "text"] print(regex.lastIndex); // prints "15" // and so on
這裏有一個外部資源,用來獲取 Unicode 中的不一樣區塊範圍:Regexp-unicode-block
var url = "http://xxx.domain.com"; print(/[^.]+/.exec(url)[0].substr(7)); // prints "xxx"
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition. Implemented in JavaScript 1.1 | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) RegExp |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) RegExp |
Standard |
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Sticky flag ("y") | ? | 3.0 (1.9) | ? | ? | ? |
[1] Behind a flag.
[2] At least from version 41.
Starting with Gecko 34 (Firefox 34 / Thunderbird 34 / SeaMonkey 2.31), in the case of a capturing group with quantifiers preventing its exercise, the matched text for a capturing group is now undefined
instead of an empty string:
// Firefox 33 or older 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:' // Firefox 34 or newer 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:undefined'
Note that due to web compatibility, RegExp.$N
will still return an empty string instead of undefined
(bug 1053944).