正则表达式
引言
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
与通配符(如*)类似,正则表达式也是用来进行文本匹配的工具,不过他要更为精确和复杂。学习正则表达式的最好办法就是利用例子学习。
元字符
现在考虑从英文小说里查找hi,你可以使用正则表达式hi
,但这样的代价是你会查找到文本中所有有hi的位置,而不是一个单词。为了查找到一个单词你可以使用\bhi\b
,他会帮你匹配单词hi存在的位置。
\b是正则表达式中元字符(metacharacter),代表单词的分界处,但请注意\b并不匹配用来分界单词的字符(如空格,标点或者换行符),他匹配的是一个位置。
更为精确的说法是:\b匹配一个前一个字符和后一个字符不全是\w的位置。
这样的元字符在正则表达式中有很多,他们帮助构建了正则表达式强大的匹配能力。你不需要全部记住,可以在使用中进行查阅,并在实践中掌握他们。
如果你要寻找这样的一个字符串:A单词后面跟着一个B单词,AB中间可以有任意字符存在。可以使用\bA\b.*\bB\b
。
这里的.
和\*
也是两个其他的元字符。.
可以匹配除了换行符之外的任何字符,而*
比较特殊,他使得前面的内容可以连续重复使用任意次来匹配字符串。
如果你学过离散数学或者计算理论,应该对*不会太过陌生(尤其是学过计算理论),之后你还会看到
+
元字符,他们的区别和你在离散数学中他们的区别相同。
下面给出常见的元字符,和使用他们的一些例子
元字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
现在我们可以回顾一下\b的精确描述,理解\w的存在。
例子
- \ba\w+\b
匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母 a,然后中间至少有一个字母或者数字(\w+),最后是单词结束处(\b)。用到了\w与+的共同使用,*可以有0,但+至少一个。
- \b\w{6}\b
匹配刚好六个字符的单词
- ^\d{5,12}$
^ 和 $保证了是整个字符串的匹配,而不是字串,{5,12}代表重复的次数不能少于5次,不能多于12次,否则都不匹配。
练习
交互式的学习正则表达式是很有帮助的,在这里我们列出了几个网站:
Regex Learn :一个正则表达式交互课程
正则表达式在线测试 :菜鸟驿站提供的正则表达式在线测试工具