正则表达式汇总
? ? ? 一直以來,遇到正則表達式的時候,我更多的時候是在網上直接查找,通俗的說就是吃等食,等著直接吃別人嚼好的饃,最終的結果無疑就是誰嚼了誰才能真正吸收營養,以致于我每次再用到它時原本以為了如指掌卻終止于似曾相識。 所以,簡單做下歸納,增加一下理解。
在這里先貼出一篇參考資料:正則表達式30分鐘入門教程:https://deerchao.net/tutorials/regex/regex.htm
一.正則表達式基礎
1.概念:正則表達式描述了一種字符串匹配的模式,可以用來檢查一個串是否有某種子串,并將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
2.正則表達式全部符號的解釋
3.屬性
? ?(1)global屬性:這個屬性指明在搜索字符串時是全局匹配還是只匹配第一個。
? ?(2)ignoreCase屬性:指明模式搜索是否區分大小寫。
4.向后引用
應用正則表達式的時候,如果想在相鄰位置重復某個字符,我們通常使用下面例子這種方法:
var reg = /\d{2,4}/;//重復單個字符 var reg = /(\d[a-z]){2,4}/;//重復某個字符串? 當要匹配的字符串不相鄰時,應該用后向引用。
說明:后向引用能夠實現歸功于正則表達式一個重要的特性,就是將匹配成功的模式的某部分進行存儲,供以后使用。也就是說,正則表達式能夠將子模式(也就是圓括號括起來的部分)存儲到一個臨時的緩沖區,并為它們從左到右按順序設置編號,這些編號從1開始,2,3,4,,,以此類推。當這些緩存區的子模式被后面引用時,就會重復搜索前面存儲的文本,所以后向引用實際上就是引用匹配的分組。對于有的時候,只想進行分組,而不想引用,則可以用"(?:exp)"的形式,既不匹配文本,也不引用編號。如:
var reg = /(\w{3})(?:\d+)([a-z]{2})\2/; var str = "man78abab"; console.log(reg.test(str));//true console.log(RegExp.$2);//ab上面例子中:上面例子中\2匹配的不是78,而是ab就是因為第二個分組不匹配文本,也不引用編號,所以(\w{3})對應\1,([a-z]{2})對應\2;
注意1:正則對象中后向引用時只能通過\n這種方式實現,不能通過$n這種方式實現,在js中可以應用RegExp.$n這種方式查看子模塊的值,另一種使用$n的方式是:
例子1:var reg = /(\d+)=(\w+)/; var str = "777=hate"; console.log(str.replace(reg,'$2=$1'));//hate=777
例子2: var str = '2013-6-7';
var re = /(\d+)(-)/g;
str = str.replace(re,function($0,$1,$2){
console.log($0);//第一次是2013- 第二次是6-
console.log($1);//第一次是2013 第二次是6
console.log($2);//第一次是- 第二次是-
return $1 + '.'; //分別返回2013. 6.
});
console.log( str ); //2013.6.7
其他分組語法:
5.次序、貪婪和懶惰
如果有這樣一個表達式:a.*b,它將會匹配最長的以a開始,以b結束的字符串,如果用它來搜索aabab的話,它會匹配整個字符串aabab,也就是說,默認情況下,正則表達式中包含能接受重復的量詞,它通常會匹配盡可能多的字符,這稱為貪婪匹配。如果想匹配盡可能少的字符,就要進行懶惰匹配,實現的方式,就是在表示次數的字符(如:* + ? {n,m} {n,})后面加 "?"。
一點說明:
var str = 'goooogle‘; var reg1 = /o+/; //"goooo" var reg2 = /o+?/; //"go"改動之后:
var str = 'goooogle‘; var reg1 = /o+gle/; //"oooogle" var reg2 = /o+?gle/; //"oooogle"后面的例子中,/o+?gle/沒有匹配到"ogle",是因為正則表達式中總是從左往右進行匹配,不會從右邊獲取子串進行匹配。
雖然上述結果相同,但是匹配的實現過程不同,在reg1中,首先o+會匹配所有的"o",然后接著匹配"gle",從而完成整體匹配。而在reg2中,o+?會先匹配一個"o",然后gle在字符串的第2位到第4位(即原串的"ooo")匹配失敗。進而回溯至o+?去匹配第二個"o",成功后再在第3位到第4位匹配"gle",以此類推……最后匹配到整個字符串。
從優先級來說,從左往右的次序匹配 > 貪婪 / 懶惰匹配。
6.位置指定
接下來的四個用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們用于指定一個位置,就像\b,^,$那樣,因此它們也被稱為零寬斷言。例如:
(?=exp)也叫零寬先行斷言,它匹配文本中的某些位置,這些位置的后面能匹配給定的后綴exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬后行斷言,它匹配文本中的某些位置,這些位置的前面能給定的前綴匹配exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。
負向位置指定
零寬負向先行斷言(?!exp),只會匹配后綴exp不存在的位置。\d{3}(?!\d)匹配三位數字,而且這三位數字的后面不能是數字。
同理,我們可以用(?<!exp),零寬負向后行斷言來查找前綴exp不存在的位置:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數字(實驗時發現錯誤?注意你的“區分大小寫”先項是否選中)。
7.方法,區別、聯系、返回值、作用對象
(1).regObj.test(strObj);
用途:用于測試字符串參數中是否存在表達式模式,返回值:boolean
(2).regObj.exec(strObj);
用途:方法用于正則表達式模式在字符串中運行查找,如果找到了匹配文本,就返回一個結果數值,否則,返回null;
(3).strObj.search(regObj);
用途:在字符串中搜索符合正則的內容,搜索到就返回出現的位置(位置從0開始計算,如果匹配到多個,只會返回第一個的位置),搜索失敗返回-1;
(4).strObj.match(regObj);
用途:在字符串中搜索符合規則的內容,搜索成功就返回內容,當全局匹配時:格式為數組,失敗就返回null;不是全局匹配時,只匹配第一個就會停止;
(5).strObj.replace(regObj,新的字符串/回調函數); 說明:第一個參數指的是每次匹配成功的字符。
用途:查找符合正則的字符串,找到了就替換成對應的字符串,然后返回替換后的內容。
轉載于:https://www.cnblogs.com/shineLh/p/6895512.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: Linux 上 GDM 登录界面如何适应
- 下一篇: SCI论文写作中的注意事项