十分钟正则小结
1年前 • 612次点击 • 来自 其他
十分钟复习下正则
在线测试工具:
常用的元字符
语法 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
重复
语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
分枝
使用**|**标识分歧,可类比编程语言中的‘或’
固定电话号码正则:
0\d{2}-\d{8}|0\d{3}-\d{7}
匹配两种以连字号分隔的电话号码:
- 3位区号,8位本地号(如001-12345678);
- 4位区号,7位本地号(0123-1234567)。
分组
使用'( )'标识分组:
IP地址正则:
(\d{1,3}\.){3}\d{1,3}
- \d{1,3}匹配1到3位的数字;
- (\d{1,3}.){3}匹配三位数字加上一个英文句号(分组)重复3次;
- 最后再加上一个一到三位的数字(\d{1,3})
反义
使用'^'标识取反:
匹配用尖括号括起来的以a开头的字符串
<a[^>]+>
语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
零宽断言
零宽度正预测先行断言
断言自身出现的位置的后面能匹配表达式exp
(?=exp)
匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc
\b\w+(?=ing\b)
零宽度正回顾后发断言
断言自身出现的位置的前面能匹配表达式exp
(?<=exp)
匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading
(?<=\bre)\w+\b
负向零宽断言
零宽度负预测先行断言
断言此位置的后面不能匹配表达式exp
(?!exp)
匹配三位数字,而且这三位数字的后面不能是数字,例如abc123456def,它匹配456
\d{3}(?!\d)
零宽度负回顾后发断言
断言此位置的前面不能匹配表达式exp
(?<!exp)
前面不是小写字母的3位数字,例如A123b123,它匹配123
(?<![a-z])\d{3}
贪婪与懒惰
默认为贪婪模式,即正则会匹配最长的结果,如
1.*1
匹配最长的以1开始,以1结束的字符串,例如1231231001,它匹配1231231001
懒惰
1.*?1
匹配最短的以1开始,以1结束的字符串,例如1231231001,它匹配到2个结果 ‘1231’和‘1001’
懒惰限定符
语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |