正则表达式实例解读
文章目錄
- 正則式 a?
- 正則式 ^\w+\d
- 正則式 (\d){4}|\1{2}
- 正則式 \d{4}|\d{2}
正則式 a?
正則式:a?
被匹配的字符串:a<>aava</>ab
看下面的 Java 代碼:
輸出的結果是:
##<#>###v##<#/#>##b#b#解讀下匹配過程:
正則式 a?,是表示匹配一個 a 或者 0 個 a, 沒有 a 也算匹配成功。首先匹配 a<>aava</>abb 的字符“a”,整個正則式匹配成功第 1 次,替換成 #,接著匹配第 2 個字符“<”,不是字符“a”,匹配字符失敗,而正則式可以匹配 0 個 a,所以會匹配字符“<”前面的位置,所以整個正則式匹配成功第 2 次(即第 2 次迭代匹配成功),我暈這樣也行!所以在字符“<” 前再插入第 2 個 #,后面也是依照這樣奇葩的邏輯去匹配替換。
正則式 ^\w+\d
正則式:^\w+\d
被匹配的字符串:1a2b2c2de
輸出結果:
結果1:#de 結果2:%1a2b2c2de匹配過程解讀:
^ 是一個虛擬的概念,表示字符串第 1 個字符的前面,字符串第 1 個字符前面有東西嗎?沒有吧,所以是一個虛擬的概念。而這個 ^ 字符告訴了正則表達式引擎要查找緊跟在頭部后面且符合正則式的字符串。
我們看到 ^ 后面跟著 \w+,而 \w 表示英文字母和阿拉伯數字中的任意一個字符,+ 則表示前面的子表達式 1 個或者多個,綜合起來的含義就是 1 個或者多個英文字母和(或)數字。所以 ^\w+ 的含義是指緊跟在頭部后面的 1 個或者多個英文字母和(或)數字。再看看正則式,后面還跟著一個 \d ,它代表匹配任意一個阿拉伯數字,所以整個正則表達式的含義是指緊跟在頭部后面的以 1 個或者多個英文字母和(或)數字組成的,且以數字為結尾的字符串。
我們看到字符串 %1a2b2c2de 查找不到符合正則式 ^\w+\d 的字符串,所以沒有替換,直接輸出原來的字符串,為什么?正則式要查找的是跟在頭部后面的且滿足正則式的字符串,現在跟在頭部后面的是 %,不滿足 \w 這個表達式,而 1a2b2c2 雖然滿足 \w+\d ,但是它并不是緊跟在頭部 ^ 的后面,它是緊跟在 % 的后面,所以結果 2 輸出原來的字符串。
正則式 (\d){4}|\1{2}
console.log("1234567890".match(/(\d){4}|\1{2}/g)); // ["1234", "5678", "", "", ""]輸出的結果:
["1234", "5678", "", "", ""]關于“或者”的正則表達式中,第 1 個表達式 (\d){4} 匹配成功,第 2 個表達式 \1{2} 就不會去匹配了,只有第 1 個匹配失敗,才會讓第 2 個去匹配。
修飾符g表示全文查找,因此前兩次匹配到了 “1234” 和 “5678”,此時正則引擎的指針處于數字 8 的后面,后面的字符顯然子表達式 (\d){4} 無法匹配了,此時第一個捕獲組 (\d) 匹配到內容為空,那么反向引用 \1 將指向空字符串,\1{2} 也就是一個空白字符串,后面可以匹配到 8、9、0 后面共 3 個位置,故最終又匹配到三個空字符串。
正則式 \d{4}|\d{2}
"1234567890".match(/\d{4}|\d{2}/g);輸出結果為:
["1234", "5678", "90"]\d{4} 匹配4個任意數字成功后,\d{2} 就不會匹配了,直到后面匹配 “90” 失敗了,才讓 \d{2} 去匹配,結果匹配成功了,字符串也到結尾了,所以最終成功匹配的結果有三個字符串。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 正则表达式的贪婪模式、非贪婪模式、占有模
- 下一篇: 正则表达式的环视深度剖析