Javascript 轉(zhuǎn)義,特殊字符

2023-02-17 11:01 更新

正如我們所看到的,反斜杠 ?\? 用于表示字符類,例如 ?\d?。所以它是正則表達(dá)式中的一個(gè)特殊字符(就像在常規(guī)字符串中一樣)。

還存在其它特殊字符,這些字符在正則表達(dá)式中有特殊的含義,例如 [ ] { } ( ) \ ^ $ . | ? * +。它們用于執(zhí)行更強(qiáng)大的搜索。

現(xiàn)在并不需要嘗試記住它們 —— 當(dāng)我們分別學(xué)習(xí)它們的時(shí)候,你自然而然就會(huì)記住了。

轉(zhuǎn)義

假如我們想要找到一個(gè)點(diǎn)號(hào) .

要將特殊字符用作常規(guī)字符,請(qǐng)?jiān)谄淝懊婕由戏葱备埽?code>\.。

這就是所謂的“轉(zhuǎn)義字符”。

例如:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1(匹配了?。?alert( "Chapter 511".match(/\d\.\d/) ); // null(尋找一個(gè)真正的點(diǎn) \.)

括號(hào)也是特殊字符,所以如果我們想要查找它們,我們應(yīng)該使用 \(。下面的例子會(huì)查找一個(gè)字符串 "g()"

alert( "function g()".match(/g\(\)/) ); // "g()"

如果我們想查找反斜杠 \,我們就應(yīng)該使用兩個(gè)反斜杠:

alert( "1\\2".match(/\\/) ); // '\'

一個(gè)斜杠

斜杠符號(hào) '/' 并不是一個(gè)特殊字符,但是它被用于在 Javascript 中開(kāi)啟和關(guān)閉正則匹配:/...pattern.../,所以我們也應(yīng)該轉(zhuǎn)義它。

下面是搜索斜杠 '/' 的表達(dá)式:

alert( "/".match(/\//) ); // '/'

從另一個(gè)方面看,如果我們沒(méi)使用 /.../,而是使用另一種 new RegExp 的方式創(chuàng)建正則表達(dá)式,則不需要轉(zhuǎn)義斜杠:

alert( "/".match(new RegExp("/")) ); // 找到了 /

new RegExp

如果我們使用 new RegExp 創(chuàng)建正則表達(dá)式,那么我們不必轉(zhuǎn)義 /,但需要進(jìn)行一些其他轉(zhuǎn)義。

例如,考慮下面這個(gè)示例:

let reg = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(reg) ); // null

在之前的示例中我們使用 /\d\.\d/ 進(jìn)行類似的搜索沒(méi)問(wèn)題,但 new RegExp("\d\.\d") 不起作用,為什么?

因?yàn)榉葱备鼙蛔址跋摹绷?。我們可能還記得,常規(guī)字符串有自己的特殊字符,例如 \n,反斜杠用于轉(zhuǎn)義。

下面是 “\d.\d” 的感知形式:

alert("\d\.\d"); // d.d

在字符串中的反斜杠表示轉(zhuǎn)義或者類似 \n 這種只能在字符串中使用的特殊字符。這個(gè)引用會(huì)“消耗”并且解釋這些字符,比如說(shuō):

  • ?\n? —— 變成一個(gè)換行字符,
  • ?\u1234? —— 變成該編碼所對(duì)應(yīng)的 Unicode 字符,
  • ……而當(dāng)沒(méi)有特殊含義時(shí):如 ?\d? 或者 ?\z?,碰到這種情況時(shí)則會(huì)自動(dòng)移除反斜杠。

所以調(diào)用 new RegExp 會(huì)獲得一個(gè)沒(méi)有反斜杠的字符串。這就是搜索不起作用的原因!

如果要修復(fù)這個(gè)問(wèn)題,我們需要雙斜杠,因?yàn)橐脮?huì)把 \\ 變?yōu)?nbsp;\

let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d(現(xiàn)在對(duì)了)

let regexp = new RegExp(regStr);

alert( "Chapter 5.1".match(regexp) ); // 5.1

總結(jié)

  • 要在字面意義上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我們需要在它們前面加上一個(gè)反斜杠 \(“轉(zhuǎn)義它們”)。
  • 如果在 /.../ 內(nèi)(但不在 new RegExp 內(nèi)),我們還需要轉(zhuǎn)義 /。
  • 當(dāng)將字符串傳遞給給 new RegExp 時(shí),我們需要雙反斜杠 \\,因?yàn)樽址?hào)會(huì)消耗一個(gè)反斜杠。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)