js匹配是js中比較重要的一個概念,我們在工作中經(jīng)常用到,但是往往都是記得不是很清楚,或者有些遺忘,這次記錄總結(jié)一下,讓自己加深一下印象,同時也會小伙伴們提供查閱資料的地方
創(chuàng)新互聯(lián)公司專注于昌邑網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供昌邑營銷型網(wǎng)站建設(shè),昌邑網(wǎng)站制作、昌邑網(wǎng)頁設(shè)計(jì)、昌邑網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造昌邑網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供昌邑網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
正則匹配模式分為兩種,一種是貪婪模式,另一種是非貪婪模式
貪婪模式:在遇到歧義時候盡可能的多的匹配符合的結(jié)果
非貪婪匹配:在遇到歧義時候匹配到一次符合的結(jié)果就不匹配了
js默認(rèn)是貪婪匹配模式,貪婪模式變成非貪婪模式只需要在貪婪量詞({n, }, {n, m}, + , ?, *)后面加一個?就行了
附加: 正則匹配中?的幾種用法
正則匹配的前瞻就是給正則匹配的選項(xiàng)定義一個斷言,或者說是一個條件比如:我要匹配一個字母,但是我的需求是字母后面必須是跟著一個數(shù)字的情況,那么這種場景是怎么實(shí)現(xiàn)了,就是用到前瞻的概念,那么我想要他的前面也要是一個數(shù)字怎么辦了,這就是后顧。
前瞻后顧的描述
正則匹配新特性
以上的三個匹配形式都是不被捕獲的,其中前兩個是不匹配的,他只是用來當(dāng)作條件來用,第三個是要被匹配的
1:任何元字符在沒有寫量詞的情況下,只匹配一次
2:寫了量詞,默認(rèn)是貪婪匹配
3:正則匹配一旦全部找到就不會在繼續(xù)去匹配,除非你設(shè)置了全局g
4:正則匹配按照匹配規(guī)如果中間中斷沒有匹配到,并且字符串沒有匹配完,會繼續(xù)按照匹配規(guī)則重新匹配
5:(pattern)如果匹配到了很多結(jié)果,只捕獲最后一次匹配到的結(jié)果
6:任何量詞都只作用于前面的元字符
1:source 2:global 3:ingoreCase 4:multiline 5:lastIndex
字符串滿足正則匹配規(guī)則就會返回true,但是如果正則匹配里面含有全局的話,那么多運(yùn)行幾遍會報(bào)錯,因?yàn)檎齽t每次匹配開始都是看lastIndex的,全局情況下lastIndex每次執(zhí)行都會被改變
如果沒有找到任何匹配就返回null,如果找到了則返回一個數(shù)組,exec方法返回的數(shù)組的第 0 個元素是與正則表達(dá)式相匹配的文本
第 1 個元素是 正則匹配到 的第 1 個子表達(dá)式相匹配的文本(如果有的話)
第 2 個元素是正則匹配到 的第 2 個子表達(dá)式相匹配的文本(如果有的話)
...
以此類推。
其中還有三個參數(shù)
index:表示匹配到的文本的第一個字符所在的索引位置
input: 表示被匹配的文本
groups:表示有名的分組
在全局下也是一樣因?yàn)閑xec永遠(yuǎn)只返回第一個匹配。
如果沒有找到任何匹配就返回null,如果找到了則返回一個數(shù)組,match方法返回的數(shù)組的第 0 個元素是與正則表達(dá)式相匹配的文本
第 1 個元素是 正則匹配到 的第 1 個子表達(dá)式相匹配的文本(如果有的話)
第 2 個元素是正則匹配到 的第 2 個子表達(dá)式相匹配的文本(如果有的話)
...
以此類推。
其中還有三個參數(shù)
index:表示匹配到的文本的第一個字符所在的索引位置
input: 表示被匹配的文本
groups:表示有名的分組
在非全局的情況下,這個方法和exec一模一樣,但是在全局的情況下,差別很大,在全局的情況下,只會返回匹配到的結(jié)果,并且lastIndex始終為0, 如果沒匹配到就返回null
該方法用來替換字符串,第一個參數(shù)是正則表達(dá)式,第二個參數(shù)可以是字符串也可以是函數(shù)
正則匹配測試工具
復(fù)制代碼
代碼如下:
var
str
=
"123#abc";
var
re
=
/abc/ig;
console.log(re.test(str));
//輸出ture
console.log(re.test(str));
//輸出false
console.log(re.test(str));
//輸出ture
console.log(re.test(str));
//輸出false
在創(chuàng)建正則表達(dá)式對象時如果使用了“g”標(biāo)識符或者設(shè)置它了的global屬性值為ture時,那么新創(chuàng)建的正則表達(dá)式對象將使用模式對要將要匹配的字符串進(jìn)行全局匹配。在全局匹配模式下可以對指定要查找的字符串執(zhí)行多次匹配。每次匹配使用當(dāng)前正則對象的lastIndex屬性的值作為在目標(biāo)字符串中開始查找的起始位置。lastIndex屬性的初始值為0,找到匹配的項(xiàng)后lastIndex的值被重置為匹配內(nèi)容的下一個字符在字符串中的位置索引,用來標(biāo)識下次執(zhí)行匹配時開始查找的位置。如果找不到匹配的項(xiàng)lastIndex的值會被設(shè)置為0。當(dāng)沒有設(shè)置正則對象的全局匹配標(biāo)志時lastIndex屬性的值始終為0,每次執(zhí)行匹配僅查找字符串中第一個匹配的項(xiàng)??梢酝ㄏ旅娴拇a來查看在執(zhí)行匹配相應(yīng)的lastIndex
屬性的值。
復(fù)制代碼
代碼如下:
var
str
=
"123#abc";
var
re
=
/abc/ig;
console.log(re.test(str));
//輸出ture
console.log(re.lastIndex);
//輸出7
console.log(re.test(str));
//輸出false
console.log(re.lastIndex);
//輸出0
console.log(re.test(str));
//輸出ture
console.log(re.lastIndex);
//輸出7
console.log(re.test(str));
//輸出false
console.log(re.lastIndex);
//輸出0
關(guān)于RegExp.prototype.exec(str)方法和String.prototype.math(rgExp)方法
正則對象的test方法返回值為true或flase,在僅需要檢測目標(biāo)字符串與指定模式是否匹配,但不需要獲取匹配內(nèi)容時這個方法非常有用。當(dāng)需要獲取匹配結(jié)果時就需要用RegExp類型的exec(str)方法或String類型的match(rgExp)方法。
RegExp.prototype.exec(str)方法返回NULL或返會一個數(shù)組,在數(shù)組的第0個元素存放的是在字符串str中查找到的匹配內(nèi)容,1到n個元素返回的是在模式中使用括號"()"指定的子匹配項(xiàng)的內(nèi)容。
在沒有使用全局標(biāo)志時String.prototype.math(rgExp)方法和RegExp.prototype.exec(str)的行為類似。當(dāng)設(shè)置了全局匹配標(biāo)志時String.prototype.math(rgExp)方法返回的數(shù)組項(xiàng)元素0到n中包含了所有匹配到的項(xiàng)不包含子匹配項(xiàng)。這時可以使用RegExp.$1..$9獲取9個子匹配。
匹配就是查找。。。
字符串有查找的方法,字符串有indexOf方法可以查找指定字符串出現(xiàn)的位置。
這實(shí)現(xiàn)的查找的功能太簡單。
比如字符串"abc123456def",你如何取出數(shù)字部分呢?
用字符串本身的查找功能就難以實(shí)現(xiàn)。
但用正則就很簡單,\d+
如:
SCRIPT?LANGUAGE="JavaScript"
!--
var?s?=?"abc123456def123";
var?re?=?/\d+/ig;
var?r?=?"";
while(r?=?re.exec(s))?{
alert(r[0]);
};
//--
/SCRIPT
有些查找功能可能用字符串拆分也可以實(shí)現(xiàn),但比較麻煩,但用正則就很簡單。