学习正则表达式
基础篇
实战篇

基础篇

这一部分主要介绍正则表达式的基本知识。

所有内容选自 Jan Goyuaerts Steven Levithan 所著 Regular Expressions Cookbook 及其中文版
为方便在线测试,所列出的样例都源于可供 javascript 测试的 ECMA-262v3标准 中定义的正则表达式流派
1 匹配字面文本
描述
使用正则表达式严格匹配含有各种字符的句子
目标文本
Hello world!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
正则表达式
Hello world!"#\$%&'\(\)\*\+,-\.\/:;<=>\?@\[\\]\^_`\{\|}~
注意
一共有12个元字符(分别是:$()*+.?[\^{|),在匹配它们时需要在前面用一个反斜杠进行转义。
2 匹配多个字符之一
描述
使用正则表达式匹配匹配多个字符之一,或是数字、字母等
目标文本
calendar
calender
celandar
...
正则表达式
c[ae]l[ae]nd[ae]r
目标文本
任意数字或字母(大小写)
正则表达式
[A-Za-z0-9]
注意
[和]内包含可供选择的文本。[A-Z]表示ASCII表中从A到Z的所有字符。
3 定义开头或结尾
描述
使用正则表达式匹配目标文本的开头或结尾部分
目标文本
hello
正则表达式
^he
目标文本
hello
正则表达式
llo$
注意
^用于匹配文本开头,$用于匹配文本结尾
4 定义边界
描述
使用正则表达式匹配完整的一个单词,或者单词的一部分。
目标文本
cat
无法匹配 category、bobcat
正则表达式
\bcat\b
注意
使用\Bcat\B可以起到相反的效果
5 选择分支
描述
使用|将正则表达式拆分成多个选择分支
目标文本
Mary, Jane and Sue went to Mary's house.
正则表达式
Mary|Jane|Sue
注意
在使用正则表达式 Jane|Janet 匹配 Her name is Janet时,只会匹配到第一个选择分支Jane。
如果想要匹配到Janet,可以将较长的选择分支放在前面,或者使用\b(Jane|Janet)\b来明确单词边界。
6 分组与捕获
描述
利用分组与捕获功能匹配先前匹配的文本 如匹配一个年(后两位)、月、日都相同的yyyy-mm-dd形式的日期
目标文本
2008-08-08
无法匹配 2008-08-09
正则表达式
\b\d\d(\d\d)-\1-\1\b
注意
分组通过()实现。
使用\1、\2来引用第1、2个捕获分组,第10个捕获分组用\10引用,依此类推。
7 量词
描述
使用量词符号{}重复之前的正则记号,并可以控制重复次数
目标文本
一个googol(一个100位的十进制整数)
正则表达式
\b\d{100}\b
注意
{1}表示重复之前的符号1次,等价于没有任何量词,{0}表示不重复,也就是把之前的部分从正则表达式中删除。
{n,m}表示重复n到m次,需满足m>=n,同样也支持如{n,}和{,m}这样的半开区间。
如果在分组的结束括号后放一个量词的话,那么整个分组会被重复。
8 贪心与懒惰
描述
使用贪心量词或懒惰量词匹配最小或最大重复次数
目标文本
<p>We need this paragraph.</p>
<p>We also need this one.</p>
正则表达式
<p>.*</p>
目标文本
<p>We need this paragraph.</p>
<p>But NOT this one.</p>
正则表达式
<p>.*?</p>
注意
*、+等属于贪心量词,它们会从后往前进行回溯,因此会尽可能多地匹配文本。
?可以将任何量词变为懒惰的,它从前往后回溯,匹配尽可能少的文本。
9 断言
描述
断言用于指定一个满足条件的位置,并查找该位置之前或之后的内容
目标文本
以ing结尾的单词ing前面的部分
starting dancing
正则表达式
\b\w+(?=ing\b)
注意
零宽断言分为4种,分别是:
零宽度正预测先行断言(?=exp),断言自身出现的位置后面能匹配表达式exp;
零宽度正回顾后发断言(?<=exp),断言自身出现的位置前面能匹配表达式exp;
零宽度负预测先行断言(?!exp),断言自身出现的位置后面不能匹配表达式exp;
零宽度负回顾后发断言(?<!exp),断言自身出现的位置前面不能匹配表达式exp。

实战篇

这一部分给出了一些使用正则表达式进行校验的样例。

所有内容选自 Jan Goyuaerts Steven Levithan 所著 Regular Expressions Cookbook 及其中文版
为方便在线测试,所列出的样例都源于可供 javascript 测试的 ECMA-262v3标准 中定义的正则表达式流派
1 验证E-mail地址合法性
目标文本
user@example.com
描述
简单限制@符号前面部分为E-mail中用户名允许的字符,后面为域名中允许的字符
正则表达式1
^[A-Za-z0-9+_.-]+@[A-Za-z0-9+_.-]$
描述
不允许前导、拖尾和连续的点号
正则表达式2
^[\w!#$%&'*+/=?'{|}~^-]+(?:\.[!#$%&'*+/=?'{|}~^-]+*@
[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*$
2 验证北美电话号码合法性
目标文本
1234567890
123-456-7890
123.456.7890
123 456 7890
(123) 456 7890
(123) 456-7890
...
正则表达式
^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$
3 验证国际号码合法性
描述
号码应该以加号开头,然后是国家代码和国内号码
目标文本
+861012345678
正则表达式
^\+(?:[0-9] ?){6,14}[0-9]$
注意
^用于匹配文本开头,$用于匹配文本结尾
4
5
6
7
8
9
测试工具
目标文本

正则表达式

匹配结果