正则表达式
1. 元字符
元字符 | 意义 | 反义的表达 |
---|---|---|
. | 匹配除换行符外所有字符 | |
\w | 字母、数字、下划线、汉字 | \W |
\s | 任意空白符 | \S |
\d | 数字 | \D |
\b | 单词的开始或结束 | \B |
^ | 字符串的开始 | [^] |
$ | 字符串的结束 |
示例
匹配有 abc
开头的字符串
\babc或^abc
匹配8位数字的QQ号码
^\d\d\d\d\d\d\d\d
匹配1开头的手机号码
^1\d\d\d\d\d\d\d\d\d\d
2. 重复限定符
为了解决上面示例的冗余,使用重复限定符
语法 | 重复次数 |
---|---|
? | 0或1次 |
* | 0或多次 |
+ | 1或多次 |
{n} | n次 |
{n,} | n或更多 |
{n,m} | n到m次 |
示例
匹配8位数字的QQ号码
^\d{8}$
匹配1开头的手机号码
^1\d{10}$
匹配银行卡号是14~18的数字
^\d{14,18}$
匹配以a开头,0个或多个b结尾的字符串
^ab*$
3. 分组、转义、条件或、区间
3.1 使用小括号进行分组
匹配以0或多个ab开头的字符串
^(ab)*
3.2 对小括号进行转义
匹配以0或多个(ab)开头的字符串
^(\(ab\))*
3.3 条件或:|
匹配联通手机号(联通手机号前三位: 130/131/132/155/156/185/186/145/176 )
^(130|131|132|155|156|185|186|145|176)\d{8}$
3.4 对上式化简,可以使用区间工具
区间 | 限定 |
---|---|
[0-9] | 0到9 |
[165] | 1,5,6 |
[A-C] | A到C |
[AC] | A,C |
化简上式
^(13[0-2]|15[56]|18[56]|145|176)\d{8}$
4. 零宽断言
-
断言判断字符串是否有
pattern
- 零宽指断言不占长度
- 注意,字符串的前后:------后-----point--->---前-------
名称 | 表达式 | 备注 |
---|---|---|
正向先行断言 | ***(?=pattern) | 与pattern匹配则返回*** |
正向后行断言 | (?<=pattern)*** | 与pattern匹配则返回*** |
负向先行断言 | ***(?!pattern) | 负向指“非”,与pattern不匹配则返回*** |
负向后行断言 | (?<!pattern)*** | 负向指“非”,与pattern不匹配则返回*** |
示例
#匹配"<span class="read-count">阅读数:641</span>"中的641
\d+(?=</span>) #正向先行断言
(?<=<span class=\"read-count\">阅读数:)\d+ #正向后行断言
#“我爱祖国,我是祖国的花朵”
祖国(?!的花朵) #负向先行断言,匹配不是'的花朵'的祖国
(?<!我是)祖国 #负向后行断言,匹配不是“我是”的祖国
5. 捕获与非捕获
捕获组:匹配子表达式的内容,把匹配结果保存到内存中中数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果
5.1 数字编号捕获组:(expression)
- 比如固定电话
020-85653333
的正则表达式为:(0\d{2})-(\d{8})
序号 | 编号 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) | 020-85653333 |
1 | 1 | (0\d{2}) | 020 |
2 | 2 | (\d{8}) | 85653333 |
5.2 命名编号捕获组: (?<name>expression)
- 固定电话
020-85653333
的正则表达式为:(?<quhao>\0\d{2})-(?<haoma>\d{8})
序号 | 名称 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) | 020-85653333 |
1 | quhao | (0\d{2}) | 020 |
2 | haoma | (\d{8}) | 85653333 |
5.3 非捕获:(?:expression)
- 标识那些不需要捕获的分组 ,可以用
(?:\0\d{2})-(\d{8})
不捕获原来的第一组
序号 | 编号 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) | 020-85653333 |
1 | 1 | (\d{8}) | 85653333 |
6. 反向引用
捕获会返回一个捕获组,并保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。
- 常用于查找一些重复的内容或替换指定字符
示例
查找一串字母"aabbbbgbddesddfiid"里成对的字母
思路:
- \w
- (\w) #捕获
- (\w)\1 #调用捕获第1组,若是命名捕获,也可用
\"name"
调用 - ?
7. 贪婪与非贪婪
7.1 贪婪
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。
文本:61762828 176 2991 44 871
贪婪模式:\d{3,6}#假如字符串里有6个数字可以匹配,那它会全部匹配到。
匹配结果:617628
匹配结果:176
匹配结果:2991
匹配结果:871
7.2 贪婪之间的优先度
- 多个贪婪时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰
- 不能满足时,根据深度优先原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2})(\d{3,4})
匹配结果:617628
匹配结果:2991
匹配结果:87321
7.3 非贪婪(懒惰)
懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。
代码 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2}?)(\d{3,4})
匹配结果:61762
匹配结果:2991
匹配结果:87321
网友评论