国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Regex > 正文

正確使用帶有"g"標記的javascript正則表達式

2020-03-16 21:16:53
字體:
來源:轉載
供稿:網友
javascript正則表達式是對字符串執行模式匹配的強大工具。正確使用它會給我們的工作帶來很大的便利。可是有些地方由于我們沒有太注意或者根本不理解,就會遇到不可預料的麻煩。
 
 
下面我們要談談帶有"g" 標記的正則表達式的使用問題,首先讓我們看一段代碼,從例子入手更容易理解。 
復制代碼代碼如下:

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)); 

運行上述代碼,在不同瀏覽器中會得到不同結果,IE中:0 true 0 true,FF和Chrome中:0 true 1 false,看到這里,想必會有人一頭霧水,感到詫異。針對這個問題,就我目前查閱資料,找到了兩種方法。 

1、使用match 

復制代碼代碼如下:

1 function a(val) 


3 { 

5 var re = /^/d+$/g; 

7 if((""+val).match(re)) 

9 return true; 
10 
11 else 
12 
13 return false; 
14 
15 } 
16 
17 alert(a(5)); 
18 
19 alert(a(6)); 

注:要使用""+val把val轉化為字符串,關于match的具體使用方法可參考這里 

2、使用不帶"g" 的正則表達式(var re=/^/d+$/或var re=new RegExp("^[0-9]+$")) 


復制代碼代碼如下:

1 function a(val) 

3 { 

5 var re = new RegExp("^[0-9]+$");//或者var re=/^/d+$/; 

7 return re.test(val); 

9 } 
10 
11 alert(a(5)); 
12 
13 alert(a(6)); 
14 
15 


注:var re = new RegExp("^[0-9]+$")中只能用[0-9],不能用/d,至于為什么,我不很明白,希望哪位知道的給講講。 

不難看出,上面兩種方法是從側面考慮怎么解決問題 的,沒有從正面解決,接下來我們從問題出現的本質上分析一下,并給出解決方法。 

要從問題出現的本質考慮,我們就不得不從"g" 標記說起,帶有"g"標記的正則表達式有一個屬性lastIndex,該屬性存放一個整數,它聲明的是上一次匹配文本之后的第一個字符的位置。上次匹配的結果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它們都以 lastIndex 屬性所指的位置作為下次檢索的起始點。這樣,就可以通過反復調用這兩個方法來遍歷一個字符串中的所有匹配文本。該屬性是可讀可寫的。只要目標字符串的下一次搜索開始,就可以對它進行設置。當方法 exec() 或 test() 再也找不到可以匹配的文本時,它們會自動把 lastIndex 屬性重置為 0。看到這里我們不難看出問題出現的原因和解決方法了,只要我們在下次搜索之前把lastIndex屬性重置為0即可,如下: 


復制代碼代碼如下:

1 function a(val) 

3 { 

5 var re = /^/d+$/g; 

7 re.lastIndex=0;//重置lastIndex為0 

9 return re.test(val); 
10 
11 } 
12 
13 alert(a(5)); 
14 
15 alert(a(6)); 


關于lastIndex的更多解釋請看這里 

至此我們已經明白問題出現的本質,以及如何較好的解決這樣的問題,希望本文對一些人有幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 布尔津县| 中方县| 闽侯县| 故城县| 贡觉县| 万州区| 淮滨县| 政和县| 昔阳县| 怀化市| 徐闻县| 宜兴市| 灌南县| 贵阳市| 毕节市| 江永县| 绩溪县| 五家渠市| 林西县| 襄垣县| 平利县| 红原县| 高邮市| 镇巴县| 永城市| 合水县| 德化县| 霞浦县| 肥西县| 徐闻县| 台山市| 隆昌县| 华坪县| 新兴县| 务川| 呈贡县| 南靖县| 上杭县| 平南县| 平昌县| 德庆县|