W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
正如我們所看到的,反斜杠 ?\
? 用于表示字符類,例如 ?\d
?。所以它是正則表達式中的一個特殊字符(就像在常規(guī)字符串中一樣)。
還存在其它特殊字符,這些字符在正則表達式中有特殊的含義,例如 [ ] { } ( ) \ ^ $ . | ? * +
。它們用于執(zhí)行更強大的搜索。
現(xiàn)在并不需要嘗試記住它們 —— 當我們分別學(xué)習(xí)它們的時候,你自然而然就會記住了。
假如我們想要找到一個點號 .
。
要將特殊字符用作常規(guī)字符,請在其前面加上反斜杠:\.
。
這就是所謂的“轉(zhuǎn)義字符”。
例如:
alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1(匹配了?。?alert( "Chapter 511".match(/\d\.\d/) ); // null(尋找一個真正的點 \.)
括號也是特殊字符,所以如果我們想要查找它們,我們應(yīng)該使用 \(
。下面的例子會查找一個字符串 "g()"
:
alert( "function g()".match(/g\(\)/) ); // "g()"
如果我們想查找反斜杠 \
,我們就應(yīng)該使用兩個反斜杠:
alert( "1\\2".match(/\\/) ); // '\'
斜杠符號 '/'
并不是一個特殊字符,但是它被用于在 Javascript 中開啟和關(guān)閉正則匹配:/...pattern.../
,所以我們也應(yīng)該轉(zhuǎn)義它。
下面是搜索斜杠 '/'
的表達式:
alert( "/".match(/\//) ); // '/'
從另一個方面看,如果我們沒使用 /.../
,而是使用另一種 new RegExp
的方式創(chuàng)建正則表達式,則不需要轉(zhuǎn)義斜杠:
alert( "/".match(new RegExp("/")) ); // 找到了 /
如果我們使用 new RegExp
創(chuàng)建正則表達式,那么我們不必轉(zhuǎn)義 /
,但需要進行一些其他轉(zhuǎn)義。
例如,考慮下面這個示例:
let reg = new RegExp("\d\.\d");
alert( "Chapter 5.1".match(reg) ); // null
在之前的示例中我們使用 /\d\.\d/
進行類似的搜索沒問題,但 new RegExp("\d\.\d")
不起作用,為什么?
因為反斜杠被字符串“消耗”了。我們可能還記得,常規(guī)字符串有自己的特殊字符,例如 \n
,反斜杠用于轉(zhuǎn)義。
下面是 “\d.\d” 的感知形式:
alert("\d\.\d"); // d.d
在字符串中的反斜杠表示轉(zhuǎn)義或者類似 \n
這種只能在字符串中使用的特殊字符。這個引用會“消耗”并且解釋這些字符,比如說:
\n
? —— 變成一個換行字符,\u1234
? —— 變成該編碼所對應(yīng)的 Unicode 字符,\d
? 或者 ?\z
?,碰到這種情況時則會自動移除反斜杠。所以調(diào)用 new RegExp
會獲得一個沒有反斜杠的字符串。這就是搜索不起作用的原因!
如果要修復(fù)這個問題,我們需要雙斜杠,因為引用會把 \\
變?yōu)?nbsp;\
:
let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d(現(xiàn)在對了)
let regexp = new RegExp(regStr);
alert( "Chapter 5.1".match(regexp) ); // 5.1
[ \ ^ $ . | ? * + ( )
,我們需要在它們前面加上一個反斜杠 \
(“轉(zhuǎn)義它們”)。/.../
內(nèi)(但不在 new RegExp
內(nèi)),我們還需要轉(zhuǎn)義 /
。new RegExp
時,我們需要雙反斜杠 \\
,因為字符串引號會消耗一個反斜杠。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: