date: 2018-12-09 14:35:00
元字符
代码 | 说明 |
---|---|
. |
匹配除换行符以外的任意字符 |
\w |
匹配字母或数字或下划线或汉字 |
\s |
匹配任意的空白符 |
\b |
匹配数字 |
^ |
匹配字符串的开始 |
$ |
匹配字符串的结束 |
转义
当需要匹配元字符本身时,需要转义,即: \元字符
重复
代码 | 说明 |
---|---|
* |
重复零次或更多次 |
+ |
重复一次或更多次 |
? |
重复零次或一次 |
{m} |
重复n次 |
{m,} |
重复n次或更多次 |
{m,n} |
重复n到m次 |
字符类
代码 | 说明 |
---|---|
[aeiou] |
匹配任何一个英文元音字母 |
[0-9] |
匹配一位数字 |
[a-z0-9A-Z_] |
匹配一个大小写字母或数字 |
分支条件
|
表示或
例如:0\d{2}-\d{8}|0\d{3}-\d{7}
能匹配两种电话号码
需要注意顺序,左侧匹配命中后就不会再继续向右进行
分组
()
表示分组
(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式
反义
元字符的反义和具体字符的反义
代码 | 说明 |
---|---|
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
后向引用(变量)
\b(\w+)\b\s+\1\b
可以用来匹配重复的单词,像go go, 或者kitty kitty
组名:使用
可以给分组命名 \b(?
分组常用的语法
代码 | 说明 |
---|---|
(exp) |
匹配exp,并捕获文本到自动命名的组里 |
(? |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
(?:exp) |
匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言
零宽度正预测先行断言
简单说
(?=exp)
位置匹配:表达式自身位置后面能匹配exp
它断言自身出现的位置的后面能匹配表达式exp
举个栗子
比如\b\w+(?=ing\b)
,匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
零宽度正回顾后发断言
简单说
(?<=exp)
位置匹配:表达式自身出现的位置前面能匹配exp
它断言自身出现的位置的前面能匹配表达式exp
举个栗子
比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
负向零宽断言
零宽度负预测先行断言
简单说
(?!exp)
位置匹配:表达式自身位置后面不能匹配exp
它断言此位置的后面不能匹配表达式exp
举个栗子
\d{3}(?!\d)
匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b
匹配不包含连续字符串abc的单词。
零宽度负回顾后发断言
简单说
(? 位置匹配:表达式自身位置前面不能匹配exp
它断言此位置的前面不能匹配表达式exp
举个栗子
(?匹配前面不是小写字母的七位数字。
零宽断言总结
代码 | 说明 |
---|---|
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 |
(?!exp) |
匹配后面跟的不是exp的位置 |
(? |
匹配前面不是exp的位置 |
注释
小括号的另一种用途是通过语法(?#comment)
来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
。
贪婪与懒惰
贪婪匹配:
a.*b
aabab => aabab
懒惰匹配:
a.*?b
aabab => aab / ab
所有表示数量的元字符后加问号都可以起到这种效果
处理选项
可以配置,忽略大小写,多行模式,单行模式,忽略空白,显示捕获等
递归匹配
可以像词法分析一样使用堆栈,比较复杂
参考链接:正则表达式30分钟入门