正則詳細教程系列可以看此鏈接的文章哦
https://www.cnblogs.com/poloyy/category/1796055.html
范圍
代碼/語法 | 說明 |
---|---|
| | 分支條件,或 |
[...] | 字符集合,多選一 |
[a-z] | 指定范圍的字符集合 |
[^...] | 取反的字符集合 |
[...] 字符集合介紹
背景
要想匹配數字,字母,空白是很簡單的,因為已經有了對應這些字符集合的元字符,但是如果你想匹配沒有預定義元字符的字符集合(比如:元音字母 a,e,i,o,u )
解決方案
很簡單,你只需要在方括號 [ ] 里列出它們就行了,像 [aeiou] 匹配任何一個英文元音字母, [.?!] 匹配任一個標點符號
重點
[...] 里面寫再多的字符集合,最終也只會匹配一個字符,和元字符一樣,如果需要重復匹配需要加上限定符
元字符等價的字符集合
元字符 | 等價語法 |
---|---|
\w | [a-zA-Z0-9_] |
\W | [^a-zA-Z0-9_] |
\s | [\n\t\r\f] |
\S | [^\n\t\r\f] |
\d | [0-9] |
\D | [^0-9] |
[...] 的栗子一
正則表達式
\(?0\d{2}[) -]?\d{8}
分析:
- 首先是一個轉義字符 \( ,它能出現 0 次或 1 次 ?
- 然后是一個 0,后面跟着2個數字 \d{2}
- 然后是 ) 或 - 或空格中的一個,它出現 0 次或 1 次 ?
- 最后是 8 個數字 \d{8}
可匹配到的字符串
- (010)88886666
- 022-22334455
- 02912345678
[...] 的栗子二
正則表達式
[123aA;]
可匹配到的字符串
只能匹配 [ ] 里面的字符
指定范圍的 [...] 的栗子一
正則表達式
[\u4e00-\u9fa5]
可匹配到的字符串
任意中文字符
指定范圍的 [...] 的栗子二
正則表達式
^\d[a-gA-Z5-9]{2,4}
分析:
- 數字開頭
- a-g 或 A-Z 或 5-9 任取2-4位
- 表達式可以等價成: ^[0-9][a-gA-Z5-9]{2,4}
可匹配到的字符串
- 6aY
- 6aY7
- 6aY78
[^...] 的栗子
正則表達式
[^abcdA-Z()-=]
分析:
可以匹配非 a、b、c、d、A-Z、( 、) 、- 、= 以外的字符
可匹配到的字符串
- e
- f
- \
- [
指定范圍的 [...] 總結
- [a-z] 如果是有指定范圍字符集的話,必須按照 ASCII 碼的順序
- [...] 只能匹配一個字符,除非加了量詞(限定符)
| 分支條件的栗子一
正則表達式
ab|cd|123|.{2}
可匹配到的字符串
- ab
- cd
- 123
- 菠蘿
| 分支條件的栗子二
正則表達式
0\d{2}-\d{8}|0\d{3}-\d{7}
可匹配到的字符串
- 012-81200111
- 0333-8120011
| 分支條件的栗子三
兩個正則表達式的區別
\d{5}-\d{4}|\d{5} :可以匹配 5 位數字 或 5位數字 - 4位數字
\d{5}|\d{5}-\d{4} :只能匹配 5 位數字
是否有個疑問
明明表達式差不多一樣啊,只是前后位置換了下而已,為啥第二種寫法只能匹配 5 位數字呢?
答案
- 因為第二種寫法,如果滿足 \d{5}-\d{4} ,那肯定也滿足 \d{5}
- 匹配分支條件時,將會從左到右地測試每個條件,如果滿足了某個分支條件的話,就不會再去匹配后面的分支了
- 所以\d{5}能匹配上,就不再去測試 \d{5}-\d{4} 是否匹配了