快速解决正则----模糊匹配、字符类、量词
主體概要
?正則表達式是什么
? ? ?是匹配模式。要么匹配字符、要么匹配位置
內容
? ? 掌握字符類和量詞就能解決大部分常見正則問題
? ?關鍵內容:字符組、量詞、貪婪、惰性、模糊、橫向、縱向、分支、位置
?
重要的基礎
? ?如何匹配字符,就靠量詞和字符類
量詞
? ?量詞即重復,找/匹配 重復字符,標志 {}?
??貪婪:在范圍內,匹配越多越好( greedy quantifiers)
1 var regex = /\d{2,5}/g; 2 var string = "123 1234 12345 123456"; 3 console.log( string.match(regex) ); 4 // => ["123", "1234", "12345", "12345"] 5 //其中正則 /\d{2,5}/,表示數字連續出現 2 到 5 次。會匹配 2 位、3 位、4 位、5 位連續數字。 View Code?有貪婪就會有懶惰
?惰性:??匹配到就行,盡力少匹配? (lazy quantifiers),標志在后面加?
1 var regex = /\d{2,5}?/g; 2 var string = "123 1234 12345 123456"; 3 console.log( string.match(regex) ); 4 // => ["12", "12", "34", "12", "34", "12", "34", "56"] 5 //其中 /\d{2,5}?/ 表示,雖然 2 到 5 次都行,當 2 個就夠的時候,就不再往下嘗試了。 View Code?
? ? ? 有嗎
? ? ?+ 至少
? ? ?* 任意??
?字符類
? ?在范圍內找\匹配,標志【】,可以是一組,也可以是其中一個字符 ,
? ?字符類,也稱字符組
?反字符類:字符類的第一位放 ^(脫字符),表示求反的概念。
? ?例如 [^abc],表示是一個除 "a"、"b"、"c"之外的任意一個字符
? 當字符組里有特別多字符,比如 [123456abcdefGHIJKLM],可以寫成 [1-6a-fG-M]。用連字符 - 來省略和簡寫。?
?
過人之處:模糊匹配
? 正則只有精確匹配,就沒什么可深入的東西。但模糊匹配才是讓正則強大的原因。
? 模糊匹配分為橫向匹配和縱向匹配。
?橫向匹配指的是,一個正則可匹配的字符串的長度不是固定的,可以是多種情況的。?
? ? ? ? ? ? ?基本和量詞配合使用,要匹配字符,可以重復多少
? ? ? ? ? ? ? ? 譬如 {m,n},表示連續出現最少 m 次,最多 n 次。?
1 //模糊匹配之--橫向匹配 2 var regex =/ab{2,5}c/g; 3 var string="abc abbc abbbc abbbbc abbbbbc abbbbbbc"; 4 console.log(string.match(regex)); 5 //=> ["abbc","abbbc","abbbbc","abbbbbc"] 橫向匹配?
?縱向匹配指的是,一個正則匹配的字符串,具體到某一位字符時,它可以不是某個確定的字符,可以有多種可能。
? ? ? ? ? 通常用字符類?配合使用,在一組里找想要字符
? ? ? ? ? 其實現的方式是使用字符類。譬如 [abc],表示該字符是可以字符 "a"、"b"、"c" 中的任何一個。??
1 //模糊匹配之--縱向匹配 2 var regex=/a[123]b/g; 3 var string="a0b a1b a2b a3b a4b"; 4 console.log(string.match(regex)); //=> ["a1b","a2b","a3b"] 縱向匹配??
選擇分支
用 |(管道符)分隔,表示其中任何之一。
1 var regex =/good|nice/g; 2 var string="good idea,nice try."; 3 console.log(string.match(regex)); //=>["good","nice"] 匹配字符串 "good" 和 "nice" View Code注意:默認從左到右匹配,左邊能匹配,就會忽略右邊?
比如我用 /good|goodbye/,去匹配 "goodbye" 字符串時,結果是 "good":
1 var regex = /goodbye|good/g; 2 var string = "goodbye"; 3 console.log( string.match(regex) ); // => ["goodbye"] View Code?
優先級
??優先級 由高到低
? 轉義? ? ? ?\
? 括號? ? ?(?!) () [] (?:)???
? ?量詞? ? {m} {m,n}?
? ?位置? ? ?^ $?
? ?分隔? ? |?
匹配位置
?1、位置(錨)是相鄰字符之間的位置 。對于位置的理解,我們可以理解成空字符 ""。 字符之間的位置,可以寫成多個??
? ? ?比如,下圖中箭頭所指的地方:
?
1 //比如 "hello" 字符串等價于如下的形式: 2 "hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "" + "o" + ""; 3 //也等價于: 4 "hello" == "" + "" + "hello" 5 //把 /^hello$/ 寫成 /^^hello$$$/,是沒有任何問題的: 6 var result = /^^hello$$$/.test("hello"); 7 console.log(result); // => true View Code?
?
?2、 斷言
? ?先行斷言:(?=) 表示 匹配 前面的位置
1 //比如 (?=l),表示 "l" 字符前面的位置,例如: 2 var result = "hello".replace(/(?=l)/g, '#'); 3 console.log(result);// => "he#l#lo" View Code?
后行斷言:(?<=)? 表示 匹配 后面的位置
如:只匹配美元符號之后數字:/(?<=\$)\d+/
?
? ?否定-先行斷言:(?!) 表示 匹配不在 前面位置就行, 與 (?=) 的互補?
1 var result = "hello".replace(/(?!l)/g, '#'); 2 console.log(result); // => "#h#ell#o#" View Code?
3、關于位置
^(脫字符)匹配開頭,在多行匹配中匹配行開頭。
? ? ? ?$(美元符號)匹配結尾,在多行匹配中匹配行結尾。
? ? ^和$?一起用,匹配整體?
\b 是單詞邊界,具體就是 \w 與 \W 之間的位置,也包括 \w 與 ^ 之間的位置,和 \w 與 $ 之間的位置。
1 //比如考察文件名 "[JS] Lesson_01.mp4" 中的 \b,如下: 2 var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#'); 3 console.log(result); // => "[#JS#] #Lesson_01#.#mp4#" View Code?
\B 非單詞邊界
1 //比如上面的例子,把所有 \B 替換成 "#": 2 var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#'); 3 console.log(result); 4 // => "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4" View Code?
??
?
正則表達式,太多字符、元字符要記,且好亂。本篇是筆記、是我個人的理解、圍繞如何”懂“正則表達式,且本篇大多數是源于《javascript正則表達式迷你書》的內容,這書比較深入理解正則表達式及正則內部匹配準則(原理)。
下一篇:快速解決正則續---屬性、方法、綜合應用? ? 會更多地展示這書的精華。
?
轉載于:https://www.cnblogs.com/TAO-JL/p/9589309.html
總結
以上是生活随笔為你收集整理的快速解决正则----模糊匹配、字符类、量词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一次作业-准备
- 下一篇: html _ 提取html片段内的纯文本