1、元字符
常用元字符如下:
元字符 | 说明 |
. | 匹配除换行符以外的 任意字符 |
\w | 匹配字母或者数字或者下划线或者汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束,(列子可看下面这个博客) |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
1、匹配有abc开头的字符串:
1 \babc或者^abc
2. 匹配8位数字的QQ号码:
1 ^\d\d\d\d\d\d\d\d$
3. 匹配1开头11位数字的手机号码:
1 ^1\d\d\d\d\d\d\d\d\d\d$
2. 重复限定符
有了这些限定符之后,我们就可以对之前的正则表达式进行改造了,比如:
1. 匹配8位数字的QQ号码:
1 ^\d{8}$
2. 匹配1开头11位数字的手机号码:
1 ^1\d{10}$
3. 匹配银行卡号是14~18位的数字:
1 ^\d{14,18}$
4. 符匹配以a开头的,0个或多个b结尾的字串
1 ^ab*$
3、分组
普通捕获组
如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照“(”出现的顺序,从左到右,从1开始进行编号的 。
命名捕获组
命名捕获组通过显式命名[在括号内最前面加上【?<名字>】,可以通过组名方便的访问到指定的组,而不需要去一个个的数编号,同时避免了在正则表达式扩展过程中,捕获组的增加或减少对引用结果导致的不可控。
不过容易忽略的是,命名捕获组也参与了编号的,在只有命名捕获组的情况下,捕获组的编号也是按照“(”出现的顺序,从左到右,从1开始进行编号的 。
普通捕获组与命名捕获组混合编号规则
混合方式的捕获组编号,首先按照普通捕获组中“(”出现的先后顺序,从左到右,从1开始进行编号,当普通捕获组编号完成后,再按命名捕获组中“(”出现的先后顺序,从左到右,接着普通捕获组的编号值继续进行编号。
也就是先忽略命名捕获组,对普通捕获组进行编号,当普通捕获组完成编号后,再对命名捕获组进行编号。
4. 转义
我们看到正则表达式用小括号来做分组,那么问题来了:
如果要匹配的字符串中本身就包含小括号,那是不是冲突?应该怎么办?
针对这种情况,正则提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,做法很简答,就是在要转义的字符前面加个斜杠,也就是\即可。
如:要匹配以(ab)开头:
^(\(ab\))*
比如匹配email中的.就需要\.进行转义,因为不转义的话.会被认为是表示匹配除换行符以外的 任意字符
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
5. 条件或
假如让我们匹配一个联通的号码,联通有130/131/132/155/156/185/186/145/176等号段,比如130xxxxxxxx这样的数字
正则用符号 | 来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。
那么我们就可以用或条件来处理这个问题
1 ^(130|131|132|155|156|185|186|145|176)\d{8}$
6. 区间
正则提供一个元字符中括号 [] 来表示区间条件。
- 限定0到9 可以写成[0-9]
- 限定A-Z 写成[A-Z]
- 限定某些数字 [165]
那上面的正则我们还改成这样:
1 ^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$
本文参考