轉自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExpgit
RegExp
構造函數建立了一個正則表達式對象,用於將文本與一個模式匹配。github
有關正則表達式的介紹,請閱讀 JavaScript指南中的正則表達式章節。web
字面量, 構造函數和工廠符號都是能夠的:正則表達式
/pattern/flags new RegExp(pattern [, flags]) RegExp(pattern [, flags])
pattern
flags
若是指定,標誌能夠具備如下值的任意組合:express
g
i
m
y
有兩種方法來建立一個RegExp對象:一是字面量、二是構造函數。要指示字符串,字面量的參數不使用引號,而構造函數的參數使用引號。所以,如下表達式建立相同的正則表達式:數組
/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
當使用構造函數創造正則對象時,須要常規的字符轉義規則(在前面加反斜槓 \)。好比,如下是等價的:dom
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
instances, see Properties of RegExp instances.
RegExp.prototype
RegExp.length
值爲 2。
RegExp
instances, see Methods of RegExp instances.
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 |
We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
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).