常见例题
例1:北美地区的电话号
编码方案:电话号码有一个3位数的区号和一位7位数的号码组成(这个7位数有分成 一个3位的局号和一个4位的路号,局号和路号之间使用连字符分隔) 每位电话号码可以是任意数字,但是区号和局号的第一位数字不能是0或1.实际书写号码是往往会把区号写在括号里面,或者将区号使用连字符和后面的局号连接起来。例如:(555)123-1234或555-123-1234,有时候在括号你里面会包含空格。例如:(555 )123-1234
文本:
J.Doe:248-555—1234
B.Smith:(313)555-1234
A.Lee:(810)555-1234
正则表达式:
\(?[2-9]\d\d\)?[-]?[2-9]\d\d-\d{4}
扩展1:还要匹配像555.555.5555这样的号码,其正则表达式为如下
[\(.]?[2-9]\d\d[\).]?[-.]?[2-9]\d\d[-.]\d{4}
例2:中国固定电话号码
最开始的一位一定为0表示长途,接着是2位、3位或者4位组成的区号,然后是7位或是8位的电话号码(其中首位不为1)。
文本:
029 88457890
02988457890
(029)88457890
029-88457890
029-8845-7890
正则表达式:(注意0后面的一位不能再是0)
[\(]?0[1-9]\d{1,3}[\(]?[-]?[2-9]\d{2,3}[-])?\d{4}
例3:美国邮政编码
使用ZIP或者是ZIP+4编码,ZIP+4是可选的,ZIP由5位号码组成,ZIP+4添加了4位,这后面的4位要与前面的5位用连字符分隔开来。
正则表达式:
\d{5}(-\d{4})?
例4:中国邮政编码
我国邮政编码的规则是,前两位是省市自治区,第三位代表邮区,第四位代表县市,最后两位代表投递邮局,总共6为数字。其中第二位不为8(港澳前两位为99,其余为0-7)
正则表达式:
\d[0-79]\d{4} \d(9|[0-7])\d{4}
例5:加拿大邮政编码(一般不区分大小写,所以)
由6个字母和数字交替出现的字符构成。每个编码分成两部分:FSA(forwardsortation area,地区代码),后三个字符给出LDU(localdelivery unit,街道代码)。第一个我字符代表省市或地区,且第一个字符有十八中选择。通常书写邮政编码时,FSA和LUD要用空格分隔。
文本:
123 4thStreet,Toronto,Ontario,M1A 1A1
567 8thAvenue,Montreal,QeuBec,H9Z,9Z9
正则表达式:
[ABCEGHJKLMNPRSTVXY]\d[A-Z]\d[A-Z]\d
例6:英国邮政编码
由5个、6个或7个字符构成,由外吗和内码构成;外码是一个或两个字母后跟一个或两个数字 ,或者是一个或两个字母后跟一个数字和一个字母;内码是一位数字后面跟两个字母(除了C、I、K、O、V以外的任意字母)。外码和内码之间要用一个空格隔开。
正则表达式:
[A-Z]{1,2}\d[A-Z\d]? \d[ABD-HJLNP-UW-Z]{2}
例7:美国社会安全码(SSN,social securitynunber)
是由3组连字符隔开的数字构成:第一组包含3位数字,第二组包含3位数字,第三组包含4位数字,
正则表达式:
\d{3}-\d{2}-\d{4}
例8:中国人民共和国公民身份号码
可能是15位或者18位。前六位是户口所在地的编码,其中第一位是1-8,此后是出生年月日,出生年份的前两位只能是18、19、20,且是可选的,月份的第一位只能是0、1,日期的第一位只能是0-3;最后一位是校验位是数字或者是X,是可选的。
正则表达式:
[1-8]\d{5}((18|19|20))?\d{2}[0-1]\d[0-3]\d{4}[\d|x]?(\d|x)?
例9:IP地址的正则表达式
正则表达式:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5))\.){3}
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5)))
例10: URL地址
对URL地址进行匹配是一个相当困难的任务,其复杂性取决于你想获得多么精确的匹配结果。最简单的情况下,URL应该匹配的内容有:协议名(http|https),一个主机名,一个可选的端口号,一个文件路径。
文本:
http://www.forta.com/blog
https://ben:password@www.forta.com/
http://localhost:8080
正则表达式:
https?://[-\w.]+(:\d+)?(/([\w\/._]*)?)?
缺点:
不能正确处理查询字符串,也不能正确理解嵌在URL中的”username:
password”
例11:完整URL地址
可以匹配URL查询字符串(嵌在URL地址里的变量信息,这些信息是用?分开的);以及可选的用户登录信息。
正则表达式:
https?://(\w*:\w*@)[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?
说明:
(\w*:\w*@): 用于匹配用于匹配嵌在URL中的用户名和口令;
(\?\S+)?: 用于匹配查询字符串;
这个模式比较复杂实际处理速度比较慢,如果没有什么特殊的必要还是不使用比较好。
例子12:电子邮件地址
正则表达式:
(\w+\.)*\w+@(\w\.)+[A-Za-z]+
说明:
(\w+\.)*: 用于匹配一个或多个由.结束的文本如ben|ben.forta.
\w+: 匹配必不可少的文本;
(\w\.)+: 匹配至少一个由.结束的文本;
[A-Za-z]+: 匹配顶级域名
缺点:
能够匹配ben..forta@forta.com但明显不是一个合法的匹配,不能匹配有IP地址组成的电子邮件地址
例13:HTML注释
HTML中的注释必须在<!-- -->标签之间必须至少包含两个连字符。多于两个是没有关系的。
正则表达式:
<!-{2,}.*?-{2,}>
说明:
这里使用懒惰型元字符。
例14:JavaScript注释
代码注释是以//开头的
正则表达式:
//.*
例15:信用卡号码
信用卡号码本身的合法性不能使用正则表达式来检查,最终要有信用卡发行机构做出,我们所说的检查是指使用正则表达式来检查信用卡号码是否符合格式。所有信用卡都遵循着同一种基本的编码模式:以特定数字序列开头,号码的总位数是一个固定值。下面是MasterCard的情况。
正则表达式:
5[1-5]\d{14}
对于Visa卡来说其信用卡号码组成有点复杂,Vis卡第一位永远为4,总长度为13或16
正则表达式:
4\d{12}(\d{3})?
但对于Discover Club卡来说,总长度为14位,必须以300到305,36或38开头;若前三位号码是300到305,后面必须再有11位数字;如果前两位号码是36或38,则后面必须再有12为数字,
正则表达式:
(30[0-5]|36\d|38\d)\d{11}
下面使用吧上面的所有模式组合既能够得到一个综合的匹配模式:
(5[1-5]\d{14})|(4\d{12}(\d{3})?)|((30[0-5]|36\d|38\d)\d{11})