最近需要用正则来匹配做数据解析方面的处理,整理一下正则表达式的基本用法,使用的时候查一查,方便快捷。
元字符
| 代码 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| * | 匹配*前边的内容重复 0 次或多次 |
| + | 匹配+前边的内容重复 1 次或多次 |
| ? | 匹配?前边的内容重复零次或一次 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
| \d | 匹配一位数字 |
| \b | 匹配单词的开始或结束 |
| \w | 匹配字母或数字或下划线或汉字 |
| \s | 匹配任意的空白符 |
如果需要匹配元字符,则需要加上转义字符
\
懒惰限定符
| 代码/语法 | 说明 |
|---|---|
| *? | 重复任意次,但尽可能少重复 |
| +? | 重复 1 次或更多次,但尽可能少重复 |
| ?? | 重复 0 到 1 次,但尽可能少重复 |
| {n,m}? | 重复 n 到 m 次,但尽可能少重复 |
| {n,}? | 重复 n 次以上,但尽可能少重复 |
a.*b,它将会匹配最长的以 a 开始,以 b 结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab。
a.*?b匹配最短的,以 a 开始,以 b 结束的字符串。如果把它应用于 aabab 的话,它会匹配 aab(第一到第三个字符)和 ab(第四到第五个字符)。
逻辑
| 代码/语法 | 说明 |
|---|---|
| {n} | 重复 n 次 |
| {n,} | 重复 n 次或更多次 |
| {n,m} | 重复 n 到 m 次 |
| [] | []中包含的字符出现任意一个 |
| | | 匹配分枝条件,从左到右地测试每个条件 |
| () | ()内为整体,与{}连用为重复()内整体 |
反义
| 代码/语法 | 说明 |
|---|---|
| \W | 匹配任意不是字母,数字,下划线,汉字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非数字的字符 |
| \B | 匹配不是单词开头或结束的位置 |
| [^x] | 匹配除了x以外的任意字符 |
| [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
常用分组语法
| 分类 | 代码/语法 | 说明 |
|---|---|---|
| 捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
| (?exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
| (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
| 零宽断言 | (?=exp) | 匹配exp前面的位置,比如\b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(除了 ing 以外的部分) |
| (?<=exp) | 匹配exp后面的位置,比如(?<=\bre)\w+\b会匹配以 re 开头的单词的后半部分(除了 re 以外的部分) |
|
| (?!exp) | 匹配后面跟的不是exp的位置 | |
| (?<!exp) | 匹配前面不是exp的位置 | |
| 注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
例子:
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式 exp。比如\b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(除了 ing 以外的部分),如查找I'm singing while you're dancing.时,它会匹配 sing 和 danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp。比如(?<=\bre)\w+\b会匹配以 re 开头的单词的后半部分(除了 re 以外的部分),例如在查找 reading a book 时,它匹配 ading。
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式 exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串 abc 的单词。
同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
参照: