正则表达式备忘

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(?\w+)\b\s+\k\b

分组常用的语法

代码 说明
(exp) 匹配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分钟入门

你可能感兴趣的:(正则表达式备忘)