常见正则表达式使用
- time: 2016-11-23 14:00
正则表达式是什么?
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。
快速理解:为了提高工作效率,比如你想在几千万个姓名中寻找一个叫徐瘦婷的人,但是你把这个瘦字忘掉了,用正则表达式可以这样写
徐.*?婷
这样就可以把所有第一个字为徐,最后一个字为婷的用户列出来,比如:
徐大婷
徐小婷
徐胖婷
.......
好了,下面整理的一些常用正则表达式的使用语法~
一.常用的元字符
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束(位置) |
^ | 匹配字符串的开始(位置) |
$ | 匹配字符串的结束(位置) |
* | 指定*前边的内容可以连续重复使用任意次(次数) |
举几个例子说明一下使用方法:
- \b : 是正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。
- \d+ : 匹配1个或更多连续的数字。这里的+是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。
- \b\w{5}\b : 匹配刚好 5 个字符的单词。
- \ba\w * \b : 匹配以字母 a 开头的单词——先是某个单词开始处(\b),然后是字母 a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。
- 0\d\d-\d\d\d\d\d\d\d\d : 匹配这样的字符串:以 0 开头,然后是两个数字,然后是一个连字号 “-”,最后是 8 个数字(也就是电话号码).简写为0\d{2}-\d{8} 。
- \bYou\b.*\bHappy\b : 先是匹配一个单词 You,然后是任意个任意字符(但不能是换行),最后是 Happy 这个单词。
- ^ \d{5,12}$: 要求数字必须为5位到12位。
注意问题:字符转义
如果你想查找元字符本身的话,比如你查找 . 或者 *,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\ 来取消这些字符的特殊意义。因此,你应该使用 \ . 和 \ * 。当然,要查找 \ 本身,你也得用 \。
例如:unibetter\.com 匹配unibetter.com,C:\\Windows 匹配 C:\Windows
二.反义字符
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
- 常用的反义代码
代码/语法 | 说明 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了 x 以外的任意字符 |
[^aeiou] | 匹配除了 aeiou 这几个字母以外的任意字符 |
举例:\S+匹配不包含空白符的字符串
<a[^>]+> 匹配用尖括号括起来的以 a 开头的字符串。
三.常用限定符
1.重复
代码 | 说明 |
* | 重复零次或多次 |
+ | 重复一次或更多次 |
s | 匹配任意的空白符 |
? | 重复零次会一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
$ | 匹配字符串的结束(位置) |
{n,m} | 重复n到m次 |
举例说明:load\d+ 匹配 load后面跟 1 个或更多数字
^\w+ 匹配一行(或一个字符串)的第一个单词
2.分组(重复多个字符)
举例:(\d{1,3}\.){3}\d{1,3} 是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:
\d{1,3} 匹配 1 到 3 位的数字,(\d{1,3}\.){3} 匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复 3 次,最后再加上一个一到三位的数字 (\d{1,3})。
- 常用分组语法
分类 | 代码/语法 | 说明 |
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
捕获 | (?< name >exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp) |
捕获 | (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
零宽断言 | (?<=exp) | 匹配exp后面的位置 |
零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 |
零宽断言 | (?<=exp) | 匹配前面不是exp的位置 |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
(注:零宽断言
像 \b , ^ , $ 那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。)
3.后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。
后向引用用于重复搜索前面某个分组匹配的文本。例如,\b(\w+)\b\s+\1\b 可以用来匹配重复的单词,像 go go, 或者 kitty kitty。
这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字 (\b(\w+)\b),这个单词会被捕获到编号为 1 的分组中,然后是 1 个或几个空白符 (\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。</br>
4.贪婪与懒惰限定符
-
贪婪限定符:最长匹配(匹配尽可能多的字符)。
举例:a.*b,它将会匹配最长的以 a 开始,以 b 结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab。
-
懒惰匹配:最短匹配(匹配尽可能少的字符)。
举例:a.*?b ,以 a 开始,以 b 结束的字符串。如果把它应用于 aabab的话,它会匹配 aab(第一到第三个字符)和 ab(第四到第五个字符)。
-
常用懒惰限定符
代码/语法 | 说明 |
*? | 重复1次或更多次,但尽可能少重复 |
+? | 重复0次或1次,但尽可能少重复 |
?? | 重复n到m次,但尽可能少重复 |
{n,m}? | 匹配不是单词开头或结束的位置 |
{n,}? | 重复n次以上,但尽可能少重复 |
四.其他常用语法
代码/语法 | 说明 |
\a | 报警字符(打印它的效果是电脑嘀一声) |
\t | 制表符,Tab |
\r | 回车/td> |
\v | 竖向制表符 |
\f | 换页符 |
\n | 换行符 |
\e | escape |
\0nn | ASCII代码中八进制代码为nn的字符 |
\xnn | ASCII代码中十六进制代码为nn的字符 |
\unnnnr | Unicode代码中十六进制代码为nnnn的字符 |
\G | 当前搜索的开头 |
介绍比较简单,详细用法可参考关于正则表达式语言元素的MSDN在线文档:https://msdn.microsoft.com/zh-cn/library/az24scfc.aspx
五.补充几个正则表达式编辑器(本小白也没用过,有待进一步探索):
Debuggex :https://www.debuggex.com/
PyRegex:http://www.pyregex.com/
Regexper:http://www.regexper.com/