正则详细教程系列可以看此链接的文章哦
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} 是否匹配了