所有的語言的正則表達(dá)式還有一些更強(qiáng)大的功能,比如
1、子表達(dá)式的索引和回溯
2、回溯引用在replace中的應(yīng)用
3、(肯定 | 否定)向前查找
4、(肯定 | 否定)向后查找 ===> JS不支持
5、條件查找 ===>JS不支持 Orz......
下面說的均是JS的正則
一、子表達(dá)式的索引和回溯
JS中用括號括起來的大部分都可以成為一個(gè)子表達(dá)式(按照先后順序從1到n),而整個(gè)正則則是第0個(gè)子表達(dá)式
例如:var reg = /(好).*?\1/g;? ===>? 這里的“(好)”就是正個(gè)reg的 ?第一個(gè) ?子表達(dá)式,后面的“\1”就代表著前面的第一個(gè)子表達(dá)式,因?yàn)槭?1 嘛!
讓我們來匹配點(diǎn)什么:var str ="你好嗎?我很好!";
str.match(reg) ===> 返回結(jié)果:["好嗎?我很好"]
這里看到了,從第一個(gè)“好”,匹配到第二個(gè)好,這也就是我理解的子表達(dá)式的索引和回溯(我是這么叫它的)。
補(bǔ)一句,reg里面的“*?”是懶惰匹配,就是盡量少的匹配,懶惰匹配的原理就是在修飾符的后面幾個(gè)“?”,因?yàn)椤??”是匹?次或者1次嘛,so你懂得。
二、回溯引用在replace中的應(yīng)用
直接從簡單的例子入手:
正則表達(dá)式:var reg = /-(\w)/g;
匹配str:var str ="my-love";
輸出:console.log(str.replace(reg,function($0,$1) {
console.log($0);
console.log($1);
}));
結(jié)果如下圖:

個(gè)人分析圖如下:

相信看了上面的分析,大家也能明白個(gè)七八,只要在replace中的函數(shù)中 return $1.toLowerCase(),是不是就完成了將帶橫線的字符轉(zhuǎn)為駝峰字符的功能?大家試一下就會了解。
這里面的“$1”我理解為正則里面的“/1”,也就是說和“/1”的思路是差不多的,只不過應(yīng)該用到replace中,不過好像也只能用到replace中,其他方面我還沒接觸到。
三、(肯定 | 否定)向前查找
先問大家一個(gè)問題,如果給大家一段話,里面有數(shù)字、中文和40$,要求匹配$前面的數(shù)字并且不能匹配后面沒有$符號的數(shù)字,大家會如何匹配呢?(先想一想)
就上面的問題來舉例子,從例子入手:
匹配的str:var str ="我出50$買靈能100%第二季";
正則表達(dá)式:var reg = /\d+(?=\$)/g;
輸出:console.log(str.match(reg));
結(jié)果為:["50"]
這個(gè)結(jié)果就是我們想要的,而“(?=\$)”就是所謂的(肯定)正向查找。
我的理解是:“(?=\$)”的“?=”的“=”后面是要匹配的關(guān)鍵字,如果匹配到,就用“\d+”(也就是(?=\$)之前的)來匹配關(guān)鍵字之前的字符串或者其他。但是最后不會包含這個(gè)關(guān)鍵字哦?,F(xiàn)在看起來是不是特別貼合這個(gè)名字“向前查找”。
那么(否定)向前查找呢?
還是那個(gè)例子只不過把正則表達(dá)式換一下
正則表達(dá)式:var reg = /\d+(?!\$)/g; ===> 注意 這里 將“?=”變?yōu)椤?!”
返回結(jié)果:["5", "100"]
為什么是這個(gè)結(jié)果呢?因?yàn)槭欠穸ǖ?,也就是取反,從?!”中的“!”可以看出,匹配的是 數(shù)字 加 $ 之外的數(shù)字,那么為什么會返回5呢,這個(gè)我猜想是懶惰匹配的,所以會匹配“0$”,將前面的“5”拋棄了,并且返回了被匹配字符串的所以其他數(shù)字,就是這樣喵。
四、(肯定 | 否定)向后查找 和 條件查找不支持,所以就沒必要說了。有興趣的可以自己去看看。
以上內(nèi)容均屬個(gè)人簡潔,不對的地方望指出,最后祝大家在前端之路上越來越順利。
沒有了~~~