简介
正则表达式(RegEx)是一种文本模式,可以用单个字符串来匹配符合正则字符串描述规则的字符。
几个简单的例子
- 直接给出字符用于精确匹配,
'\d'
匹配一个数字,'\w'
匹配一个字母数字或下划线。那么,'\d00'
可以匹配数字 ‘000’ 、 ‘700’ ,不能匹配 ‘a00’;而'\w00'
则可以匹配 ‘a00’。 '.'
可以匹配任意字符,因此上面的 ‘000’ 、 ‘700’ 、 ‘a00’ 都可以使用'...'
来匹配;此外'...'
还可以匹配 ‘abc’ 、 ‘p_y’ 等等。'{}'
可以限定'{}'
前匹配符的个数,所以 上例中的'...'
可以直接使用'.{3}'
来代替,表示匹配 3 个任意字符。还有一些其他的限定符,与'{n}'
用法类似,之后再详谈。'*'
表示任意个字符,'+'
表示至少一个字符,'?'
表示 0 或 1 个字符;'{m, n}'
表示 m-n 个字符,'{, n}'
表示至多'[ ]'
用于表示范围,意指匹配'[ ]'
中的内容,可以进行更精确的匹配,'[a-zA-Z0-9]'
可用于匹配大小写字母和数字,这样,例二中的 ‘000’ 、 ‘700’ 、 ‘a00’ 、 ‘abc’ 可以使用'[a-zA-Z0-9]*'
匹配,而 ‘p_y’ 则不行。
常用元字符
注:所有用到的特殊符号如 $ 等,在用于原义匹配是需要使用 /
转义。
打印字符
打印字符可以用于匹配一个显示字符。
字符 | 简介 | 等价表达 |
---|---|---|
\w | 匹配一个数字、字母或下划线 | [A-Za-z0-9_] |
\W | 匹配一个非字母数字下划线的字符 | A-Za-z0-9\_ |
\d | 匹配一个数字 | [0-9] |
\D | 匹配一个非数字的字符 | 0-9 |
. | 匹配一个任意字符 | 略 |
定位符
定位符用于确定匹配项的位置。
字符 | 简介 | 例子 |
---|---|---|
^ | 匹配字符串的开头位置 | '^\d' 匹配以数字开头的字符串 |
$ | 匹配字符串的结尾位置 | '\d$' 匹配以数字结尾的字符串 |
\b | 匹配一个单词的边界,即字符和空格交界处 | 'ty\b' 匹配在单词最后两位的 ty |
\B | 非单词边界匹配 | '\Bty' 匹配不在单词开头两位的 ty |
限定符
字符 | 简介 | 例子 |
---|---|---|
* | 匹配前面的表达式0 或 多 次 | '\d*' 匹配任意个数字 |
+ | 匹配前面的表达式至少一次 | '\d+' 匹配至少一个数字 |
? | 匹配前面的表达式 0 或 1 次 | '\d+' 匹配 0 或 1 个数字 |
{n} | 匹配 n 个字符 | \d{2}' 匹配 2 位数字 |
{m, n} | 匹配 m - n 个字符 | '\d{3, 5}' 匹配 3 - 5 个数字 |
{n, } | 匹配至少 n 个字符 | '\d{2, }' 匹配至少 2 位数字 |
选择符
字符 | 简介 | 例子 |
---|---|---|
| | “或”,两项取其一 | 略 |
[xyz] | 字符集和,表示范围,匹配 x、y、z 中的一个 | '[a-zA-Z0-9]' 匹配一个大小写字母或数字 |
xyz | 字符集和,表示范围,匹配不在 x、y、z 中的一个字符 | '[^a-zA-Z0-9]' 匹配既不是字母又不是数字的字符 |
() | 匹配 pattern 并缓存这一匹配,使用 \n 可匹配第 n 个缓存项 | '(.)(.)\2\1' 可匹配 ABBA 形式的字符串 |
(?:) | 匹配 pattern 这一匹配,这里可以使用 “或” 字符 (|) 来组合一个模式的各个部分 | 'industr(?:y|ies) ' 可匹配 industry 或 industries |
贪婪模式和非贪婪模式
*
、+
限定符都是贪婪的,会尽可能多的匹配符合条件的字符串。
若使用 <.*>
来匹配字符串 '<h1>dream land</h1>'
,会匹配整个字符串。
如果想要得到标签内容 'h1'
,则可以使用 '.*?'
匹配。
添加 ? 即可实现非贪婪或最小匹配。
常用匹配
匹配电子邮箱
'\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}'
匹配手机号
'(13\d|14[579]|15[^4\D]|17[^49\D]|18\d)\d{8}'
匹配时间(时:分:秒)
'([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d'
其他元字符
非打印字符
字符 | 简介 | 举例/等价表达 |
---|---|---|
\cx | 匹配由 x 指明的控制字符 | '\cM' 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 c 字符 |
\f | 匹配一个换页符 | \x0c 和 \cL |
\n | 匹配一个换行符 | \x0a 和 \cJ |
\r | 匹配一个回车符 | \x0d 和 \cM |
\t | 匹配一个制表符 | \x09 和 \cI |
\v | 匹配一个垂直制表符 | \x0b 和 \cK |
\s | 匹配一个任意空白字符 | [\f\n\r\t\v] |
\S | 匹配一个任意非空白字符 | \f\n\r\t\v |
最后,推荐两个网站:
Regex Golf - 用于正表达式练习
正则表达式测试工具 - 写正则表达式时用于检测是否有效,还可生成代码