N007 正则表达式的18条入门匹配规则



如果要评选IT技能里面最让人头疼的东西,正则表达式一定会榜上有名。想要精通反人类的正则表达式的确很难,但其实掌握少量常用的规则就能应对大量的使用场景了。以下是我认为最重要的18条匹配规则:

位置规则(3个)

匹配符 用法
\b 单词的开始或结束
^ 字符串的开始
$ 字符串的结束

注:用两个\b包裹单词可以匹配单词;用^$包裹字符串可以匹配字符串。

特殊规则(4个)

匹配符 用法
\ 转义字符
| 规则分支
() 规则分组
\n 对分组后向引用

注:转义字符作用于后侧字符;规则分支优先匹配前侧规则。

单个字符(5个)

匹配符 用法
\d 数字字符
\s 空白字符
\w 字母/数字/汉字/下划线
. 任意的非换行字符
[] 指定范围的字符

注:空白字符包括空格、换行等;[]中的具体项或范围不需要转义。

重复次数(6个)

匹配符 用法
* 重复0次以上
+ 重复1次以上
? 重复0次或1次
{n} 重复n次
{n,} 重复n次以上
{n,m} 重复n至m次

注:可以将?理解为有或无;所有的重复匹配符都是作用于前侧字符。

简单的使用实例

这里有一个挺不错的JavaScript正则表达式在线测试工具可以拿去用。给乏味的匹配符作如上分组归类就是为了方便复习,但有些例子可能会更好理解:

实例1:匹配QQ号码

首先需要分析QQ号码的特征。一个QQ号至少是5位的,每一位都是0-9的数字,貌似通过\d{5,}就可以解决问题。但不要忘了,第一位不能是0,所以修正为[1-9]\d{4,}才能正确匹配。

实例2:匹配身份证号

新的身份证位数都是18位的,但据说以前是15位的,后3位通过?即可实现有无。另一个值得注意的是,18位身份证的最后一位可以是x/X,这样\d{15}(\d\d[0-9xX])?就能实现匹配了。

实例3:匹配HTML元素

元素包括标签、属性和内容,而空元素又是在开始标签就闭合的。如果是非空元素,需要保证开始标签和结束标签的标签类型是相同的,这需要通过分组和后向引用来实现。非空元素和空元素可以分开写,分别是<(.*).*>.*<\/\1><.*\/>两部分,二者之间由|连接即可。值得注意的是,由于前者需要保证标签类型一致,需要使用2次.*分别代表标签类型和属性;而后者则可以只使用一次来统一匹配标签类型和属性。

以上便是正则表达式的入门规则与应用。每次用到时拎出来复习强化,并随时学习其他额外的规则,没准这个反人类的东西就能被驾驭了。

参考文章

评论