参考:正则表达30分钟入门教程
* 重复0次或多次
+ 重复1次或多次
? 重复0次或1次
{m} 重复m次
{m,} 重复m次或更多次
{m,n} 重复m次到n次
. 匹配换行符外的任意一个字符
\w 匹配一个字母或数字或下划线或汉字
\s 匹配任意一个空白字符
\d 匹配一个数字
\b 匹配一个单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
[abcde] 匹配abcde中的一个字符
[^abcde] 匹配非abcde中的一个字符
[a-z0-9A-Z] 匹配a-z,0-9,A-Z中的一个字符
| 或; 分支条件
() 分组
\ 转义字符
分支条件
使用‘|’来标明分支,分支条件的顺序是从左到右
eg.
0\d{2}-\d{8}|0\d{3}-\d{7} 匹配两种电话号010-12345678和0375-1234567
分组
用()括起来的就是一个分组,是一个子表达式
eg.
(\d{1,3}\.){3}\d{1,3}表式一个IP地址,不过256.300.888.999这样的非法地址也在匹配之列
每个分组自动有一个组号,从左至右,以左括号为标志,组号从1开始累加
向后引用用于重复前匹配的文本,用
\组号来引用,eg.
\b(\w+)\b\s+\1\b来匹配如go go这样的重复单词
常用分组语法
(exp) 匹配exp,并捕获内容到自动命名的组里,引用方式
\组号
(?<name>exp) 匹配exp,并捕获内容到名为name的组里,引用方式
\k<name>
(?:exp) 匹配exp,不捕获也不分配组号
(?=exp) 匹配exp前面的
位置,eg. \bw+(?=ing\b)匹配以ing结尾的单词的前面部分,如reading的read
(?<=exp) 匹配exp后面的
位置,eg. (?<=\bre)\w+\b匹配以re开头的单词的后面部分,如reading的ading
(?!exp) 匹配后面不是exp的
位置,eg. \d{3}(?!\d)匹配三个数字,这三个数字后面不能是数字
(?<!exp) 匹配前不是exp的
位置,eg. (?<![a-z])\d{7}匹配7个数字,前面不能是小写字母
(?#comment) 注释,comment中可以包括换行符等
贪婪与懒惰
默认情况下正则会尽可能多的匹配,如用a.*b来搜索aabab,会匹配aabab而不是aab
懒惰是尽可能的少匹配,如果需要懒惰匹配,则只需要在表重复的元字符后加
?
懒惰限定符语法:
*? 重复任意次,但尽可能地少重复
+? 重复1次或多次,但尽可能地少重复
?? 重复0次或1次,但尽可能地少重复
{m,n}? 重复m次到n次,但尽可能地少重复
{n,}? 重复n次或更多闪,但尽可能地少重复