今天的杭州也是陽光明媚,可能一年中最好的天氣就這幾天了吧
2018-04-10 杭州.png
工作中遇到下面的問題谦炒。
表達(dá)式轉(zhuǎn)義符 \ 的使用 以及 動(dòng)態(tài)生成正則表達(dá)式的方法积暖;
1. \ 的用法
\ 主要是用法是在正則表達(dá)式中的特殊符號(hào)轉(zhuǎn)換為它本身的意思,比如$在正則表達(dá)式中代表: 匹配字符串的結(jié)尾孙咪,在多行檢索中堪唐,匹配一行的結(jié)尾。
但是今天的情況是在正則表達(dá)式中翎蹈,字符串本身以$開頭和結(jié)束淮菠。比如:
/*
* field本身以$開頭和結(jié)束
* 我們想將他的$lac$替換掉
*/
var field = '$lac$,$ci$';
field = field.replace(RegExp(/$lac$,$ci$/), 'wor');
console.log(field)
結(jié)果為:
image.png
沒有成功,是因?yàn)楝F(xiàn)在的$是屬于正則表達(dá)式荤堪,而不是字符$合陵,因此我們在$前加上 \ 再試一試
image.png
成功枢赔。上面就是 \ 一般情況下的用發(fā)。下面總結(jié)下 \ 在動(dòng)態(tài)語句中的用法以及如何動(dòng)態(tài)生成正則表達(dá)式
2.動(dòng)態(tài)生成正則表達(dá)式
- 1.方法1,這里例子相同拥知。但是 \ 的用法有區(qū)別
/**
* field本身以$開頭和結(jié)束
* 我們想將他的$lac$替換掉
*/
var k = 'lac';
var field = '$lac$,$ci$';
/*
* 這里我們將 '$' + k + '$' 拼接
* 此時(shí)不能直接用 \ 而應(yīng)該用兩個(gè) \\
* 第一個(gè) \ 的作用是轉(zhuǎn)義踏拜,將第二個(gè) \ 從字符串轉(zhuǎn)為正則表達(dá)式的 \
* 否則 第二個(gè) \ 只是普通的字符串不能將$轉(zhuǎn)義
*/
field = field.replace(RegExp('\\$' + k + '\\$'), '$wor$');
console.log(field)
下圖模擬:
測試結(jié)果
- 2.第二種動(dòng)態(tài)生成,用eval()方法
/**
* field本身以$開頭和結(jié)束
* 我們想將他的$lac$替換掉
*/
var k = 'lac';
var field = '$lac$,$ci$';
// eval(k = '\\$' + k + '\\$')也能使用
eval(k = '\$' + k + '\$');
field = field.replace(k , 'wor');
console.log(field)
測試結(jié)果.png
這個(gè)問題折騰了我好久:
image.png
解答(來自http://www.w3school.com.cn/jsref/jsref_replace.asp)
image.png
所以每兩個(gè)$$會(huì)變?yōu)?(直接量符號(hào))
$&會(huì)變成正則表達(dá)式低剔,如下圖:
image.png
下面我們來解釋一下:
var field = '$a$bdc';
field = field.replace(/\$a\$/gm , '$wor$&');
console.log(field)
var field = '$a$bdc';
// $& 會(huì)替換為正則表達(dá)式
// $wor$& 相當(dāng)于$wor + $a$
field = field.replace(/\$a\$/gm , '$wor$&');
console.log(field)
// 故得到 $wor$a$bdc