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

2023-02-17 11:01 更新

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

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

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

轉(zhuǎn)義

假如我們想要找到一個點號 .

要將特殊字符用作常規(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

如果我們使用 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

總結(jié)

  • 要在字面意義上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我們需要在它們前面加上一個反斜杠 \(“轉(zhuǎn)義它們”)。
  • 如果在 /.../ 內(nèi)(但不在 new RegExp 內(nèi)),我們還需要轉(zhuǎn)義 /
  • 當將字符串傳遞給給 new RegExp 時,我們需要雙反斜杠 \\,因為字符串引號會消耗一個反斜杠。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號