亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

JS中的正則表達式及pattern的注意事項

2020-03-16 21:03:34
字體:
來源:轉載
供稿:網友
本文給大家介紹js中的正則表達式的注意事項以及pattern的注意事項,需要的小伙伴可以參考下本篇文章
 

RegExp對象的創建:

  常規的正則表達式的創建可用直接量,即斜杠 “/” 括起來的字符。但在要求參數變化的環境下,RegExp()構造函數是更好的選擇:
 

  1. var reg1 = /'/w+'/g; 
  2. var reg2 = new RegExp('/'//w+/'','g'); 
?

  對比兩種創建方式,RegExp中的第一個參數為要創建的正則字符串,一方面注意,因為不是直接量的表示形式,因此不用斜杠“ / ”括起來了;而是字符串中必須要對引號“ ‘ ”和轉義符號“ / ”進行二次轉義。

  此外,無論是直接量還是RegExp()構造函數,都是生成了新的RegExp對象,并將其賦值給變量。

在《Javascript權威指南》一書中講到,對于正則表達式的直接量,ECMAscript 3規定在每次它時都會返回同一個RegExp對象,因此用直接量創建的正則表達式的會共享一個實例。直到ECMAScript 5才規定每次返回不同的實例。

各瀏覽器中,IE一直遵守ECMAScript 5中的規定,其他瀏覽器的較老版本則遵循ECMAScript 3的規定。因此在實際應用中,采取構造函數創建的方法比較安全,或者在使用lastIndex屬性時要記得歸0。

括號()的使用:

  1、分組

  即把單獨項組合成子表達式統一處理,一般用于?、+、*、{n,m}等的重復處理。見例子:

var reg = /Java(script)?/;

式子里將script進行統一處理。

  2、向后引用

  即在正則表達式中用“/n”(n代表引用的序號)引用式中前面括號中匹配的文本。見例子:
 

  1. var reg = /(/d+)[a-z]{3}/1/;  
  2. //20man20 
  3. //20man23 錯 
  4. //reg = //1[a-z]{3}(/d+)/; 錯 
?

  注意 “/n”引用的是前面匹配的文本" 20 ",而不是匹配的正則表達式" /d+ "。另外,JS里只能引用前面的匹配文本,像例子中的將 /1寫在括號引用的前面,將不會匹配到任何文本,瀏覽器中會提示出錯。同樣,JS里也不支持類似“ (?<name>exp) ”(exp為正則字符)的引用命名規則,只支持數字的引用。

  既然提到了分組和引用,如果只想進行分組,而不想引用,則可用 "(?: exp)"的形式,既不匹配文本,也不給引用編號。見例子:
 

  1. var reg = /(/w{3})(?:/d+)([a-z]{2})/2/; 
  2. //man7788abab 
?

顯然 /2 匹配的是 "ab" 而不是 "7788" 。這樣便于分組處理,也加快了查詢的效率。

  3、子模式匹配

  有時我們想直接引用操作括號匹配的本文,那么可以用子模式匹配的功能(權威指南里叫子模式匹配,有點別扭,實際就是用一個變量形式替換匹配的文本)?;拘问绞怯?'$n'的形式替代匹配編號為n的文本,常用在String對象里的replace()方法,見例子,等號兩邊交換單詞:
 

  1. var reg = /(/w+)=(/w+)/; 
  2. var str = ‘love=hate'; 
  3. str.replace(reg,'$2=$1'); 
  4. //"hate=love" 
?

次序、貪婪、懶惰:

  一般的重復匹配字符如?、+、*、{n,m}在匹配的過程中,采用貪婪匹配的方法,即盡可能多的匹配到結果字符。與之對應的是懶惰匹配,即盡可能少的匹配結果,使用形式只需在重復匹配字符后加上問號" ? "即可,如??、+?、*?、{n,m}?。見例子:
 

  1. var str = 'goooogle‘; 
  2. var reg1 = /o+/;   //"goooo" 
  3. var reg2 = /o+?/;  //"go" 
?

  現在對例子稍加改動:
 

  1. var str = 'goooogle‘; 
  2. var reg1 = /o+gle/;  //"oooogle" 
  3. var reg2 = /o+?gle/;  //"oooogle" 
?

  改過后的例子結果變為相同了,為什么 /o+?gle/ 沒有匹配到“ogle”呢?原來正則表達式中總是從左往右進行匹配的,不會從右邊獲取子串進行匹配。

  雖然上面的結果相同,但匹配的原理不太一樣。在reg1中,首先o+會匹配所有的"o",然后接著匹配"gle",從而完成整體匹配。而在reg2中,o+?會先匹配一個"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失敗。進而回溯至o+?去匹配第二個"o",成功后再在第3位到第4位匹配"gle",以此類推……最后匹配到整個字符串。

  總體要記住,從優先級來說,從左往右的次序匹配 > 貪婪 / 懶惰匹配。

零寬斷言:

  關于零寬斷言的總體解釋可參考博文《正則表達式30分鐘入門教程》,值得注意的是,JS里只支持零寬先行斷言。即零寬正預測先行斷言"(?=exp)"和零寬負預測先行斷言“(?!exp)"。
  所謂“零寬”,就是它并不在匹配的結果字符中占據空間。例如“/w","/s"就會占據一個或幾個空間,依匹配的字符長度決定。而像”^","$"這種對應的首末位置,不占據空間,零寬就是屬于這一類。

  所謂“正 / 負預測”,是指斷言中要求滿足的情況。“正”表示要滿足exp,“負”表示要不滿足exp的。

  所謂"先行",是指被匹配的字符串在前面,零寬斷言跟在后面。即串的后一部分是否滿足斷言。

  所謂“斷言”,就是判斷的條件。

  看兩種零寬斷言的例子:
 

  1. var str = 'java coffeescript'
  2. var reg1 = //b/w+(?=script/b)/; //coffee  
  3. var reg2 = //b/w+(?!script/b)/; //java 
?

  reg1為零寬正預測先行斷言,"(?=script/b)"表示某單詞需以“script”結尾,它代表著一種條件,不占有任何空間大小。

  同樣,reg2為零寬負預測先行斷言,"(?!script/b)"表示不以“script”結尾的單詞。

  另外,因為沒有零寬后顧斷言,不能判斷某字符串的前面部分滿足什么條件。但在JS中可以用多次正則表達式來實現:先匹配到要找的串,然后截取開頭到index的字符子串,再匹配子串末尾是否符合需要的斷言條件。具體用法可另外嘗試一下。

match()與exec()的異同:

  match和exec是正則表達式匹配字符串的常用方法。兩者實現的功能差不多,有些細微的區別:

  1、使用方式

  match是字符串包裝對象的方法,用法:String.match(RegExp);
  exec是正則表達式對象的方法,用法:RegExp.exec(String);

  2、返回的結果

    當RegExp沒有設置全局標志 "g" 時:

      兩者的返回結果相同。即無匹配值時返回null,有匹配值時返回一個數組(令array)。array[0]為匹配的字符串,array[1]、array[2]……則對應為正則表達式中圓括號匹配的子字符串$1、$2……。同時數組帶有兩個屬性,array.index表示匹配字符串的初始位置,array.input表示正在檢索的字符串。

    當RegExp有設置全局標志 "g" 時:

      match在有值時返回一個數組array。數組的每項依次表示匹配到的所有的字符串,因此不再有圓括號匹配的子字符串了。此時數組沒有index屬性和input屬性。

      exec則與沒有全局標示 "g" 的表現無異。此時返回的是數組array,array[0]為當前匹配的字符串,array[1],array[2]……則為當前匹配下的圓括號匹配的字串。此時要注意RegExp對象的lastIndex屬性,表示原字符串中匹配的字符串末尾的后一個位置。當沒有進一步的匹配結果時,lastIndex屬性置0。因此,可用lastIndex的循環找出所有的匹配字符串。來看看例子:
 

  1. var str = 'I love1 my job22'
  2. var reg = //b[a-z]+(/d+)/b/g; 
  3. array = str.match(reg); 
  4. //array = ["love1", "job22"]  
  5. //array.index = undefind 
  6. //array.input = undefined 
  7. ------------------------------------ 
  8. array = reg.exec(str); 
  9. //array = ["love1", "1"] 
  10. //array.index = 2 
  11. //array.input = "I love1 my job22" 
  12. //reg.lastIndex = 7 
  13. //run again 
  14. reg.exec(str); 
  15. //array = ["job22", "22"] 
  16. //array.index = 11 
  17. //array.input = "I love1 my job22" 
  18. //reg.lastIndex = 16 
  19. //run again 
  20. reg.exec(str); 
  21. //reg.lastIndex = 0 
?

  最后,考慮到ECMAScript 3 和ECMAScript 5的版本區別,每次匹配完之后記得要手動將RegExp對象的lastIndex屬性置0,以滿足老非IE瀏覽器的要求。

js正則表達式,pattern,注意事項

一句話,請使用,//w+@+/w+(/.+/w+){1,}/.test(str)  來驗證,不要用"/w+@+/w+(/.+/w+){1,}".test(str) 來驗證;
使用后者,直接,用add@dfddf 就可以通過驗證了;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频福利一区| 亚洲欧洲日本专区| 欧美劲爆第一页| 91在线精品播放| 亚洲va国产va天堂va久久| 久久成年人免费电影| 成人疯狂猛交xxx| 琪琪第一精品导航| 国产91精品黑色丝袜高跟鞋| 高清欧美电影在线| 欧美资源在线观看| 欧美性xxxxhd| 欧美一区二区色| 欧亚精品中文字幕| 热99精品只有里视频精品| 亚洲国产成人精品一区二区| 日韩的一区二区| 亚洲美女精品成人在线视频| 一区二区福利视频| 午夜免费在线观看精品视频| 久久久久久av| 久久激情视频免费观看| 97精品一区二区三区| 亚洲最大的网站| 亚洲精品国产精品自产a区红杏吧| 欧美日本在线视频中文字字幕| 久久天天躁狠狠躁夜夜爽蜜月| 成人激情视频在线| 欧美激情免费观看| 中文字幕9999| 81精品国产乱码久久久久久| 国产精品久久久久久久久久尿| 91欧美视频网站| 国产成人精品免费久久久久| 国产免费久久av| 疯狂做受xxxx欧美肥白少妇| 亚洲在线www| 久久亚洲春色中文字幕| 国产精品视频xxx| 中文在线不卡视频| 神马久久久久久| 日韩中文在线不卡| 日韩成人中文电影| 97国产精品视频人人做人人爱| 欧美一区二区色| 亚洲国产天堂久久综合| 成人观看高清在线观看免费| 成人伊人精品色xxxx视频| 亚洲精品中文字幕有码专区| 91香蕉嫩草神马影院在线观看| 亚洲a级在线播放观看| 成人写真福利网| 久久久久久久久久久亚洲| 国产成人一区二区三区小说| 亚洲新中文字幕| 久久精品国产2020观看福利| 欧美在线xxx| 欧美一级淫片videoshd| 亚洲人成在线播放| 日本国产高清不卡| 久久久av网站| 日韩一级裸体免费视频| 亚洲国产精品久久精品怡红院| 久久亚洲精品一区| 2019中文字幕全在线观看| 91美女高潮出水| 中文国产成人精品久久一| 亚洲视频专区在线| 国产精品久久久久久久久男| 精品久久久香蕉免费精品视频| 国产午夜精品全部视频播放| 91色琪琪电影亚洲精品久久| 国产免费一区二区三区在线观看| 欧美性jizz18性欧美| 色综合久久88| 亚洲国产精品热久久| 日韩国产欧美精品在线| 国产精品日韩久久久久| 久久99国产精品自在自在app| 国产亚洲精品久久久久久777| 岛国av一区二区三区| 欧美亚洲伦理www| 亚洲伊人一本大道中文字幕| 精品国产91乱高清在线观看| 91在线免费网站| 欧美在线一区二区三区四| 成人啪啪免费看| 69久久夜色精品国产69乱青草| 久久久亚洲成人| 久久久精品亚洲| 欧美日韩在线看| 久久精品国产成人| 国产亚洲日本欧美韩国| 中文字幕亚洲欧美一区二区三区| 国产成人aa精品一区在线播放| 欧美理论片在线观看| 亚洲午夜av久久乱码| 亚洲精品日韩av| 高清日韩电视剧大全免费播放在线观看| 亚洲最新av在线网站| 在线精品91av| 北条麻妃在线一区二区| 国产中文欧美精品| 91sa在线看| 国产成人精品亚洲精品| 欧美在线视频观看免费网站| 欧美日韩第一页| 久久精品欧美视频| 精品magnet| 欧美激情一区二区三区久久久| 亚洲成人三级在线| 欧美日本精品在线| 欧美丰满片xxx777| 欧美一区二区三区免费视| 久久韩剧网电视剧| 国产成人精品视频在线| 亚洲国产高清高潮精品美女| 中文字幕在线视频日韩| 麻豆国产精品va在线观看不卡| 欧美日韩亚洲精品一区二区三区| 91精品国产一区| 欧美成人午夜免费视在线看片| 日本久久久a级免费| 亚洲一品av免费观看| 国产精品1区2区在线观看| 亚洲bt欧美bt日本bt| 91九色视频导航| 亚洲综合社区网| 中文字幕亚洲无线码a| 久久久久久久色| 欧美体内谢she精2性欧美| 国产精品美女网站| 欧美黑人国产人伦爽爽爽| 欧美高清视频在线| 欧美精品一区二区三区国产精品| 久久久999国产精品| 欧美日韩激情视频| 日韩电影在线观看中文字幕| 日韩精品视频在线播放| 亚洲综合中文字幕在线观看| 5566成人精品视频免费| 久久成年人免费电影| 亚洲精品欧美极品| 国产精品高精视频免费| 亚洲一区二区三| 狠狠爱在线视频一区| 久久精品免费播放| 国产精品69久久| 在线视频亚洲欧美| 国产精品999| 欧美一级淫片丝袜脚交| 久久精品视频va| 中文字幕日韩精品在线| 欧美激情日韩图片| 在线观看国产精品淫| 欧美激情视频在线免费观看 欧美视频免费一| 国产成人精品网站| 欧美激情videoshd| 日韩av中文字幕在线| 久久精品视频网站| 国产69精品久久久久9| 青青草99啪国产免费| 亚洲午夜未满十八勿入免费观看全集| 国产精品夜色7777狼人|