简介
正则表达式是一种描绘字符串样貌的语言,用来匹配字符串。它不属于某种特定编程语言,其身影几乎无所不在,甚至是VIM等编辑器的重要组成部分。使用正则表达式能显得高端、优雅,因为它难。
下面总结下学习心得。
基本套路:
正则描述字符串的基本方法是:
元素名 + 数量
例如,匹配1个或多个’A’:A+
其中,字符'A'
原封不动,“+”
是一个**“限定符”**,描述数量,代表一个或多个。
再例如,匹配连续3个数字:\d{3}
其中,\d
是一个**“元字符”**,代表一个数字,限定符{3}
指定数量为3个。
(元字符指有特殊含义的字符,限定符指指示数量的字符)
掌握了这个基本原则,就能看懂一半正则表达式了。
元素名
普通字符
普通字符直接写,例如abc
,就能匹配字符串abcde中的abc。
元字符
想表达特殊含义需要用元字符,常用的有:
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
指定范围
想表达某个范围用方括号包起来[]
,中括号视为一个整体,代表一个字符。
代码 | 说明 |
---|---|
[ABC] | ABC中的一个 |
[A-Z] | 从A到Z中的一个 |
[0-9a-zA-Z_] | 等价于\w |
[^abcd] | 反义字符组,匹配任意不在括号内的字符。也可以写成[^a-d] |
(^
出现在方括号里是转义的意思,其它地方用来描述“开始位置”)
转义:
有时很不巧,需要匹配元字符本身,就需要转义,即元字符前面加反斜杠'\'
。
比如查找一对[]
,应为:\[\]
。
如果查找\
本身,应为:\\
。
数量
常用限定符
代码 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
以上,有了元素名+数量的组合就能匹配大多模式了。
例如
\d{5,12}
,匹配“连续5到12个数字”,如1234567;
\w+[1-9]
匹配“一个或多个字符+从1到9的一位数字”,如a1或abc9。
但有时需要描述得更精确些,例如指定只能出现在开始或结束位置等。
再精确点
位置
要描述有些字符只能在开头或结尾出现,就需要描述位置。
代码 | 说明 |
---|---|
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
匹配8位电话号码时,可以使用:^\d{8}$,限制了开始结束,整个字符串都要与其匹配,这样就过滤掉了a12345678,或12345678bcd。
分组:
小括号()
依然是传统意义上的分组。
例如,(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式。
除了分组外,()
还有“捕获”的功能,配合指示符使用可以表示匹配项,\1
到\9
代表第n个括号分组匹配的文本。
例如:
\b(\w+)\b\s+\1\b
可以用来匹配重复的单词,像go go, 或者kitty kitty。其中\1
代表第一个括号匹配的内容。
(注意:\1
到\9
必须与()
一起服用)
分支:
也就是正则表达式中的“或”,用“|”表示。
123|abc
匹配字符串123或abc
注意不要再用多余的方括号[]了!常见错误,匹配(555)或555,写成:[(\(\d{3}\))|\d{3}]
。正确写法是:(\(\d{3}\))|\d{3}
。
以上是正则表达式的基本套路。
参考资料:
正则还有很多知识,可以参考:
Learn Regular Expressions (RegEx) with Ease
测试工具:
小结
一点经验是,复杂的正则表达式可以先拿出纸笔写一写,因为手写可以有层次分明的括号和间隔,看起来能稍微清晰点。