文章目录
- 元字符
- 反义
- 其它符号
- 贪婪和懒惰模式
- 常用示例
- 1. 不匹配
- 辅助工具
- 教程
元字符
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
符号 | 作用 | 示例 |
---|---|---|
. | 匹配任意单个字符 | 例如1.3可能是1后面跟任意字符,再跟3 |
^ | 匹配字符串首 | 例如^12可能是123,但不能是312 |
$ | 配字符串尾 | 例如12$可以是可以312,当不能是123 |
[] | 匹配括号内输入的任意字符 | [123]可以为1,2或3 |
* | 匹配任意数量的前导字符 | 例如1*2可以为任意数量1(甚至没有),后面跟一个2 |
+ | 匹配至少一个前导字符 | 例如1+2必须为一个或多个1,后跟一个2 |
? | 匹配一个前导字符或为空 | 例如1?2可以为2或这12 |
\w \W | 匹配包括下划线的任何单词字符 匹配任何非单词字符 | \w类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集 \W等价于“[^A-Za-z0-9_]” |
\d \D | 匹配一个数字字符。 匹配一个非数字字符 | 等价于[0-9] 等价于[^0-9] |
\s \S | \s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等 \S匹配不包含空白符的字符串 | |
\b \B | \b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 \B匹配任意不是空白符的字符 | 例如,“\bend\b” 在匹配 “weekend,endfor,end” 时,能匹配"end",无法匹配weekend和endfor |
反义
表达式 | 作用 | 示例 |
---|---|---|
[^x] [^abc] | 匹配不包含x的任意字符 匹配不包含abc的任意字符 |
其它符号
符号 | 作用 | 示例 |
---|---|---|
( ) | 子表达式(即用小括号括起来指定子表达式,也叫做分组) | 例如(/d{4}) | (/d{6}) 匹配长度为4或者6位数的数字 |
| | 分支条件(类似“或”的作用) | 例如(/d{4}) | (/d{6}) 匹配长度为4或者6位数的数字 |
{n} | n是一个非负整数。匹配确定的n次 | 例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o |
{n,} | n是一个非负整数。至少匹配n次。 | 例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次 | 例如,“o{2,3}”将匹配“hjk23kkkk”中kkkk中的前3个 |
贪婪和懒惰模式
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,考虑这个表达式:a.b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
- 懒惰限定符
符号 | 作用 | 示例 |
---|---|---|
*? | 重复任意次,但尽可能少重复 | 例如a.*?b 匹配aabab中的aab和最后的ab |
+? | 重复1次或更多次,但尽可能少重复 | |
?? | 重复0次或1次,但尽可能少重复 | |
{n,m}? | 重复n到m次,但尽可能少重复 | |
{n,}? | 重复n次以上,但尽可能少重复 |
常用示例
1. 不匹配
功能 | 示例 | 测试字符串 | 备注 |
---|---|---|---|
匹配不以字符串Livy开头的字符串 | ^(?!Livy).* | 1. (?!E) :这是个断言 2. (?!E) : 表达式后面紧跟着E才能匹配。例如,const(?=char)匹配“const”且其后必须有"char" | |
匹配不以字符串Livy或Hassan开头的字符串 | ^((?!Livy)(?!Hassan).*)$ | 同上 | |
匹配不以字符串Livy或Hassan开头、并以.zip字符串结尾的字符串 | ^((?!Livy)(?!Hassan).*)(.zip)$ | LIvy_Eng_V1.000.00018.zip Hassan_Eng000000.1.R.221118.zip DH_Eng_0.0000000.18.zip DH_Eng_0.00001118.zip DH_En00.0000000.1.x118.zip DH_X_En0.0000021118.zip DH_En000.0000000.1.r.221118.zi Eng_Hassan_00021118.zip | 同上 |
辅助工具
软件:RegexBuddy
菜鸟教程——正则表达式在线测试
教程
原理介绍