首页 > 代码库 > 正則表達式常见例题
正則表達式常见例题
常见例题
例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 4th Street, Toronto, Ontario, M1A 1A1
567 8th Avenue, 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),一个主机名,一个可选的port号。一个文件路径。
文本:
http://www.forta.com/blog
http://www.forta.com/
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中的username和口令;
(\?\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})
正則表達式常见例题