正確使用帶有"g"標(biāo)記的javascript正則表達(dá)式
更新時(shí)間:2009年05月29日 20:50:15 作者:
javascript正則表達(dá)式是對(duì)字符串執(zhí)行模式匹配的強(qiáng)大工具。正確使用它會(huì)給我們的工作帶來(lái)很大的便利??墒怯行┑胤接捎谖覀儧](méi)有太注意或者根本不理解,就會(huì)遇到不可預(yù)料的麻煩。
下面我們要談?wù)剮в?g" 標(biāo)記的正則表達(dá)式的使用問(wèn)題,首先讓我們看一段代碼,從例子入手更容易理解。
1 function a(val)
2 {
3 var re = /^\d+$/g;
4 alert(re.lastIndex);
5 return re.test(val);
6 }
7 alert(a(5));
8 alert(a(6));
運(yùn)行上述代碼,在不同瀏覽器中會(huì)得到不同結(jié)果,IE中:0 true 0 true,FF和Chrome中:0 true 1 false,看到這里,想必會(huì)有人一頭霧水,感到詫異。針對(duì)這個(gè)問(wèn)題,就我目前查閱資料,找到了兩種方法。
1、使用match
1 function a(val)
2
3 {
4
5 var re = /^\d+$/g;
6
7 if((""+val).match(re))
8
9 return true;
10
11 else
12
13 return false;
14
15 }
16
17 alert(a(5));
18
19 alert(a(6));
注:要使用""+val把val轉(zhuǎn)化為字符串,關(guān)于match的具體使用方法可參考這里
2、使用不帶"g" 的正則表達(dá)式(var re=/^\d+$/或var re=new RegExp("^[0-9]+$"))
1 function a(val)
2
3 {
4
5 var re = new RegExp("^[0-9]+$");//或者var re=/^\d+$/;
6
7 return re.test(val);
8
9 }
10
11 alert(a(5));
12
13 alert(a(6));
14
15
注:var re = new RegExp("^[0-9]+$")中只能用[0-9],不能用\d,至于為什么,我不很明白,希望哪位知道的給講講。
不難看出,上面兩種方法是從側(cè)面考慮怎么解決問(wèn)題 的,沒(méi)有從正面解決,接下來(lái)我們從問(wèn)題出現(xiàn)的本質(zhì)上分析一下,并給出解決方法。
要從問(wèn)題出現(xiàn)的本質(zhì)考慮,我們就不得不從"g" 標(biāo)記說(shuō)起,帶有"g"標(biāo)記的正則表達(dá)式有一個(gè)屬性lastIndex,該屬性存放一個(gè)整數(shù),它聲明的是上一次匹配文本之后的第一個(gè)字符的位置。上次匹配的結(jié)果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點(diǎn)。這樣,就可以通過(guò)反復(fù)調(diào)用這兩個(gè)方法來(lái)遍歷一個(gè)字符串中的所有匹配文本。該屬性是可讀可寫(xiě)的。只要目標(biāo)字符串的下一次搜索開(kāi)始,就可以對(duì)它進(jìn)行設(shè)置。當(dāng)方法 exec() 或 test() 再也找不到可以匹配的文本時(shí),它們會(huì)自動(dòng)把 lastIndex 屬性重置為 0??吹竭@里我們不難看出問(wèn)題出現(xiàn)的原因和解決方法了,只要我們?cè)谙麓嗡阉髦鞍裭astIndex屬性重置為0即可,如下:
1 function a(val)
2
3 {
4
5 var re = /^\d+$/g;
6
7 re.lastIndex=0;//重置lastIndex為0
8
9 return re.test(val);
10
11 }
12
13 alert(a(5));
14
15 alert(a(6));
關(guān)于lastIndex的更多解釋請(qǐng)看這里
至此我們已經(jīng)明白問(wèn)題出現(xiàn)的本質(zhì),以及如何較好的解決這樣的問(wèn)題,希望本文對(duì)一些人有幫助。
復(fù)制代碼 代碼如下:
1 function a(val)
2 {
3 var re = /^\d+$/g;
4 alert(re.lastIndex);
5 return re.test(val);
6 }
7 alert(a(5));
8 alert(a(6));
運(yùn)行上述代碼,在不同瀏覽器中會(huì)得到不同結(jié)果,IE中:0 true 0 true,FF和Chrome中:0 true 1 false,看到這里,想必會(huì)有人一頭霧水,感到詫異。針對(duì)這個(gè)問(wèn)題,就我目前查閱資料,找到了兩種方法。
1、使用match
復(fù)制代碼 代碼如下:
1 function a(val)
2
3 {
4
5 var re = /^\d+$/g;
6
7 if((""+val).match(re))
8
9 return true;
10
11 else
12
13 return false;
14
15 }
16
17 alert(a(5));
18
19 alert(a(6));
注:要使用""+val把val轉(zhuǎn)化為字符串,關(guān)于match的具體使用方法可參考這里
2、使用不帶"g" 的正則表達(dá)式(var re=/^\d+$/或var re=new RegExp("^[0-9]+$"))
復(fù)制代碼 代碼如下:
1 function a(val)
2
3 {
4
5 var re = new RegExp("^[0-9]+$");//或者var re=/^\d+$/;
6
7 return re.test(val);
8
9 }
10
11 alert(a(5));
12
13 alert(a(6));
14
15
注:var re = new RegExp("^[0-9]+$")中只能用[0-9],不能用\d,至于為什么,我不很明白,希望哪位知道的給講講。
不難看出,上面兩種方法是從側(cè)面考慮怎么解決問(wèn)題 的,沒(méi)有從正面解決,接下來(lái)我們從問(wèn)題出現(xiàn)的本質(zhì)上分析一下,并給出解決方法。
要從問(wèn)題出現(xiàn)的本質(zhì)考慮,我們就不得不從"g" 標(biāo)記說(shuō)起,帶有"g"標(biāo)記的正則表達(dá)式有一個(gè)屬性lastIndex,該屬性存放一個(gè)整數(shù),它聲明的是上一次匹配文本之后的第一個(gè)字符的位置。上次匹配的結(jié)果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點(diǎn)。這樣,就可以通過(guò)反復(fù)調(diào)用這兩個(gè)方法來(lái)遍歷一個(gè)字符串中的所有匹配文本。該屬性是可讀可寫(xiě)的。只要目標(biāo)字符串的下一次搜索開(kāi)始,就可以對(duì)它進(jìn)行設(shè)置。當(dāng)方法 exec() 或 test() 再也找不到可以匹配的文本時(shí),它們會(huì)自動(dòng)把 lastIndex 屬性重置為 0??吹竭@里我們不難看出問(wèn)題出現(xiàn)的原因和解決方法了,只要我們?cè)谙麓嗡阉髦鞍裭astIndex屬性重置為0即可,如下:
復(fù)制代碼 代碼如下:
1 function a(val)
2
3 {
4
5 var re = /^\d+$/g;
6
7 re.lastIndex=0;//重置lastIndex為0
8
9 return re.test(val);
10
11 }
12
13 alert(a(5));
14
15 alert(a(6));
關(guān)于lastIndex的更多解釋請(qǐng)看這里
至此我們已經(jīng)明白問(wèn)題出現(xiàn)的本質(zhì),以及如何較好的解決這樣的問(wèn)題,希望本文對(duì)一些人有幫助。
相關(guān)文章
正則表達(dá)式不區(qū)分大小寫(xiě)以及解決思路的探索 .
今天在寫(xiě)一個(gè)正則表達(dá)式的時(shí)候,因?yàn)樽址写笮?xiě)的問(wèn)題,多種大小寫(xiě)的組合,這時(shí)想到了用正則表達(dá)式2014-06-06[a] 1 [/a]轉(zhuǎn)換為網(wǎng)址的UBB的正則
[a] 1 [/a]轉(zhuǎn)換為網(wǎng)址的UBB的正則...2007-11-11正則表達(dá)式匹配(URL、電話、手機(jī)、郵箱)的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了正則表達(dá)式匹配(URL、電話、手機(jī)、郵箱)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08