正则表达式
由普通字符以及特殊字符组成的文字模式
1 基本语法及使用
(1)例子
如要找出文档里的所有we单词,如果直接输入we可能会把well,wet等也匹配进来
但如果加上\bwe\b则可以解决这个问题,这是因为\b是一个特殊的元字符,代表单词的开头或结尾
(2)常用元字符
元字符的四种作用:匹配字符、匹配位置、匹配数量和匹配模式。
常见元字符 | |
---|---|
. | 匹配除换行符以外的任意字符 |
\b | 匹配单词的开始或结束 |
\d | 匹配数字 |
\w | 匹配字母、数字、下划线或汉字 |
\s | 匹配任意空白符,包括空格、制表符、换行符、中文全角空格等 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
eg:匹配所有以s开头的单词可以用:"\bs\w*\b",以s开头的字符串可用"^\s\w*$"
(3)字符转义
用于查找特殊字符时,可用”\“来取消特殊字符的特殊意义
eg:①查找“.”,“\”时,可以写成“.”,“\”
②查找“www.baidu.com”时可用“www.baidu.com”来查找
(4)重复
常用限定符 | |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
eg:
①hello\d+:匹配hello后面跟1个或更多数字,例如hello1或者hello10等情况
②^\d{5,12}$:匹配5到12个数字的字符串,例如QQ号
③^\d{11}$:匹配11个数字的字符串,例如电话号码,身份证号码,学号等也可类似
④word\d?:匹配word后面更0个或1个数字的情况。
(5) 字符集合
自定义字符集合:通过[]来实现
eg:①[abcde]是匹配abcde中的任意一个字符,[.?!]匹配.?!中的任意一个
②指定范围的[0-9]等价\d,[a-z0-9A-Z]等价于\w
(6)分支条件
指正则表达式里面有几种匹配条件,满足其中任意一种都应该匹配,具体方法是"|"把不同的规则分隔开。
同时需要注意的是,匹配条件时,将会从左到右的测试每个条件,如果满足了某一个条件就不管其他条件。
eg:匹配电话号码时,电话号码一种是:三位区号-八位本地号,四位区号-七位本地号;
可用0\d{2}-\d{8}|0\d{3}-\d{7}进行匹配
(7) 分组
以写出一个IP地址表达式为例。
eg:①((\d{1,3}).){3}\d{1,3}。这个可能匹配出333.444.555.666之类的不存在的地址,故需要改进
②((25{0-5}|2{0-4}{0-9}|[0-1]\d{2}|[1-9]?\d).){3}(25{0-5}|2{0-4}{0-9}|[0-1]\d{2}|[1-9]?\d)
(8) 反义
\B | 匹配不是单词的开始或结束 |
\D | 匹配任意非数字的字符 |
\D+ | 匹配非数字的一个或多个字符 |
\W | 匹配任意不是字母、数字、下划线或汉字的字符 |
\S | 匹配任意不是空白符(括空格、制表符、换行符、中文全角空格等)的字符 |
{^a} | 匹配除了a以外的任意字符 |
{^abcde} | 匹配除了abcde以外的字符 |
(9) 后向引用
使用小括号指定一个表达式就可以看做一个分组。以分组的左括号为标志,第一个出现分组的组号为一,第二个为2。
也可以自定义子表达式的组名,使用(?\d+)或者(?‘Digit’\d+),就把"\d+"的组名指定为Digit了。要反向引用这个组捕获的内容,可以使用\k
捕获 | |
---|---|
(exp) | 匹配exp,并捕文本到自动命名的组里 |
(?exp) | 匹配exp,并捕获文本到名称为name的组里,也可写成(?'name’exp) |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
(10) 零宽断言
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
(11) 注释
(?#comment) | 不对正则表达式的处理产生任何影响,只用于提供注释 |
eg:\b\w+(?#字符串)\b