0%

RegularExpression

简介

正则表达式(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 - 用于正表达式练习
正则表达式测试工具 - 写正则表达式时用于检测是否有效,还可生成代码

参考链接

菜鸟教程
廖雪峰官网