正则表达式

正则表达式之常用表达式

1. 匹配数字

1.验证数字:^\d$
描述:匹配一个数字,只能输入1个数字

2.只能输入n个数字: ^\d{n}$
例如^\d{8}$
描述:匹配8个数字,匹配的例子12345678,22223334,12344321等

3.只能输入至少n个数字:^\d{n,}$
例如^\d{8,}$
描述:匹配最少n个数字,匹配的例子 12345678,123456789,12344321

4.只能输入m到n个数字: ^\d{m,n}$
例如^\d{7,8}$
描述:匹配m到n个数字,匹配的例子 12345678,1234567,不匹配的例子 123456,123456789

5.只能输入数字: ^[0-9]*$
描述:匹配任意个数字,匹配的例子 12345678,1234567,不匹配的例子 E

6.只能输入某个区间数字: ^[12-15]$
描述:匹配某个区间的数字,匹配的例子 12,13,14,15

7.只能输入0和非0打头的数字:^(0|[1-9][0-9]*)$
描述:可以为0,第一个数字不能为0,数字中可以有0,匹配的例子 12,10,101,100,不匹配的例子 01,月儿

8.只能输入实数:^[-+]?\d+(\.\d+)?$
描述:匹配实数,匹配的例子 18,+3.14,-9.90,不匹配的例子 .6,33s,67-99

9.只能输入n位小数的正实数:^[0-9]+(.[0-9]{n})?$
例如^[0-9]+(.[0-9]{2})?$
描述:匹配n位小数的正实数,匹配的例子 2.22,不匹配的例子2.222,-2.22

10.只能输入m-n位小数的正实数:^[0-9]+(.[0-9]{m,n})?$
例如^[0-9]+(.[0-9]{1,2})?$
描述:匹配m到n位小数的正实数,匹配的例子 2.22,2.2,不匹配的例子 2.222,-2.2222

11.只能输入非0的正整数:^\+?[1-9][0-9]*$
描述:匹配非0的正整数,匹配的例子 2,23,234,不匹配的例子 0,-4

12.只能输入非0的负整数:^\-[1-9][0-9]*$
描述:匹配非0的负整数,匹配的例子 -2,-23,-234,不匹配的例子 0,4

验证整数:^-?\d+$
验证整数:^-?[1-9]\d*$
验证正整数:^[1-9]\d*$
验证负整数:^-[1-9]\d*$
验证整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非负整数(正整数 + 0): ^\d+$
验证非负整数(正整数 + 0):^[1-9]\d*|0$
验证非正整数(负整数 + 0):^((-\d+)|(0+))$
验证非正整数(负整数 + 0):^-[1-9]\d*|0$
验证非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
验证非负浮点数(正浮点数 + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
验证非正浮点数(负浮点数 + 0):^((-\d+(\.\d+)?)|(0+(\.0+)?))$
验证非正浮点数(负浮点数 + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
验证正浮点数 :^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
验证正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
验证负浮点数 :^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
验证负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
验证浮点数 :^(-?\d+)(\.\d+)?
验证浮点数:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

2. 匹配字符

13.只能输入n个字符:^.{n}$
例如^.{4}$
描述:匹配n个字符,注意汉字只算1个字符,匹配的例子 1234,12we,123清,清清月儿,不匹配的例子 0,123,123

14.只能输入英文字符: ^.[A-Za-z]+$
描述:匹配英文字符,大小写任意,匹配的例子 Asp,WWW,不匹配的例子 0,123,123www

15.只能输入大写英文字符:^.[A-Z]+$
描述:匹配英文大写字符,匹配的例子 NET,WWW, 不匹配的例子 0,123,123www

16.只能输入小写英文字符:^.[a-z]+$
描述:匹配英文大写字符,匹配的例子 asp,csdn,不匹配的例子 0,NET,WWW

验证长度为3的字符:^.{3}$
验证由26个英文字母组成的字符串:^[A-Za-z]+$
验证由26个大写英文字母组成的字符串:^[A-Z]+$
验证由26个小写英文字母组成的字符串:^[a-z]+$
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$

3. 匹配字符数字

17.只能输入英文字符+数字:^.[A-Za-z0-9]+$
描述:匹配英文字符+数字,匹配的例子 1Asp,W1W1W, 不匹配的例子 0,123,123

18.只能输入英文字符/数字/下划线:^\w+$
描述:匹配英文字符或数字或下划线,匹配的例子 1Asp,WWW,12,1_w,不匹配的例子 3#,2-4,w#$

4. 匹配复杂数据

19.密码举例:^.[a-zA-Z]\w{m,n}$
描述 匹配英文字符开头的m-n位字符且只能数字字母或下划线

20.验证首字母大写:\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b
描述:首字母只能大写,匹配的例子 Asp,Net

21.验证网址(带?id=中文):^http:\/\/([\w-]+(.[\w-]+)+(\/[\w- .\/\?%&=\u4e00-\u9fa5]*)?)?$
描述:验证带?id=中文(VS.NET2005无此功能 ), 匹配的例子 http://….t?id=月儿

22.验证汉字:^[\u4e00-\u9fa5]{0,}$
描述:只能汉字,匹配的例子 月儿,不匹配的例子dda

23.验证QQ号:[0-9]{5,9}
描述:5-9位的QQ号,匹配的例子 10000,123456,不匹配的例子 10000w

24.验证电子邮件:\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
描述:注意MSN用非hotmail.com邮箱也可以,匹配的例子 aaa@msn.com,不匹配的例子 111@1.com

25.验证身份证号:^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$
描述:粗验,最好服务器端调类库再细验证,匹配的例子 15或者18位的身份证号,支持带X的

26.验证手机号:^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8}
描述 包含159/130-139手机号,匹配的例子 139XXXXXXXX,不匹配的例子 140XXXXXXXX

27.验证电话号码号
方案一 :((\(\d{3}\)|\d{3}-)|(\(\d{4}\)|\d{4}-))?(\d{8}|\d{7})
方案二 :(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)
描述 上海:02112345678 3+8位
上海:021-12345678
上海:(021)-12345678
上海:(021)12345678
郑州:03711234567 4+7位
杭州:057112345678 4+8位

28.验证护照:(P\d{7})|G\d{8})
描述:验证P+7个数字和G+8个数字

29.验证IP:^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$
描述:验证IP,匹配的例子 192.168.0.1 222.234.1.4

30.验证域:^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.s|)$
描述:验证域,匹配的例子 csdn.net baidu.com it.com.cn,不匹配的例子 192.168.0.1

31.验证信用卡:^((?:4\d{3})|(?:5[1-5]\d{2})|(?:6011)|(?:3[68]\d{2})|(?:30[012345]\d))[ -]?(\d{4})[ -]?(\d{4})[ -]?(\d{4}|3[4,7]\d{13})$
描述:验证VISA卡,万事达卡,Discover卡,美国运通卡

32.验证ISBN国际标准书号:^(\d[- ]*){9}[\dxX]$
描述:验证ISBN国际标准书号,匹配的例子 7-111-19947-2

33.验证GUID全球唯一标识符:^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$
描述:格式8-4-4-4-12,匹配的例子 2064d355-c0b9-41d8-9ef7-9d8b26524751

34.验证文件路径和扩展名:^([a-zA-Z]\:|\\)\\([^\]+\)*[^\/:*?”<>|]+\.txt(l)?$
描述:检查路径和文件扩展名,匹配的例子 E:\mo.txt,不匹配的例子 E:\ , mo.doc, E:\mo.doc

35.验证HTML颜色值:^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$
描述:检查颜色取值,匹配的例子 #FF0000

5. 常用表达式

验证十六进制值:^#?([a-f0-9]{6}|[a-f0-9]{3})$

验证用户名:^[a-z0-9_-]{3,16}$
验证用户密码:^[a-z0-9_-]{6,18}$
验证用户密码:^[a-zA-Z]\w{5,17}$ 以字母开头,长度在6-18之间,只能包含字符、数字和下划线。

验证Unicode编码中的汉字范围:^[\u4e00-\u9fa5],{0,}$
验证中文字符的正则表达式: [\u4e00-\u9fa5]
验证双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

验证空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

验证首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

验证一年的12个月:^(0?[1-9]|1[0-2])$
评注:正确格式为“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
评注:正确格式为01、09和1、31。

验证HTML标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
验证HTML 标签的正则表达式:^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

验证Email地址的正则表达式:^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
验证Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*
评注:表单验证时很实用

验证URL的正则表达式:^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.-])\/?$
验证URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

验证IP 地址:^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
验证IP地址:\d+.\d+.\d+.\d+
评注:提取ip地址时有用

验证电话号码:^((\d{3,4})|\d{3,4}-)?\d{7,8}$:
正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证固话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

验证帐号是否合法:^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用,字母开头,允许5-16字节,允许字母数字下划线

验证腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

验证中国大陆邮政编码:[1-9]\d{5}(?!\d)
评注:中国大陆邮政编码为6位数字

验证身份证:\d{15}|\d{18}
评注:中国大陆的身份证为15位或18位

使用技巧

先粗后精,先加后减。使用正则表达式语法对于目标文本进行描述和界定,可以像画素描一样,先大致勾勒出框架,再逐步在局步实现细节。仍举刚才的手机号的例子,先界定\d{11},总不会错;再细化为1[358]\d{9},就向前迈了一大步(至于第二位是不是3、5、8,这里无意深究,只举这样一个例子,说明逐步细化的过程)。这样做的目的是先消除漏匹配(刚开始先尽可能多地匹配,做加法),然后再一点一点地消除误匹配(做减法)。这样有先有后,在考虑时才不易出错,从而向“不误不漏”这个目标迈进。

留有余地。所能看到的文本sample是有限的,而待匹配检验的文本是海量的,暂时不可见的。对于这样的情况,在写正则表达式时要跳出所能见到的文本的圈子,开拓思路,作出“战略性前瞻”。例如,经常收到这样的垃圾短信:“发票”、“发#漂”。如果要写规则屏蔽这样烦人的垃圾短信,不但要能写出可以匹配当前文本的正则表达式 发#,还要能够想到 发.(?:票|漂|飘)之类可能出现的“变种”。这在具体的领域或许会有针对性的规则,不多言。这样做的目的是消除漏匹配,延长正则表达式的生命周期。

明确。具体说来,就是谨慎用点号这样的元字符,尽可能不用星号和加号这样的任意量词。只要能确定范围的,例如\w,就不要用点号;只要能够预测重复次数的,就不要用任意量词。例如,写析取twitter消息的脚本,假设一条消息的xml正文部分结构是且正文中无尖括号,那么[^<]{1,480}这种写法的思路要好于.*,原因有二:一是使用[^<],它保证了文本的范围不会超出下一个小于号所在的位置;二是明确长度范围,{1,480},其依据是一条twitter消息大致能的字符长度范围。当然,480这个长度是否正确还可推敲,但是这种思路是值得借鉴的。说得狠一点,“滥用点号、星号和加号是不环保、不负责任的做法”。

不要让稻草压死骆驼。每使用一个普通括号()而不是非捕获型括号(?:…),就会保留一部分内存等着你再次访问。这样的正则表达式、无限次地运行次数,无异于一根根稻草的堆加,终于能将骆驼压死。养成合理使用(?:…)括号的习惯。

宁简勿繁。将一条复杂的正则表达式拆分为两条或多条简单的正则表达式,编程难度会降低,运行效率会提升。例如用来消除行首和行尾空白字符的正则表达式s/^\s+|\s+$//g;,其运行效率理论上要低于s/^\s+//g; s/\s+$//g; 。这个例子出自《精通正则表达式》第五章,书中对它的评论是“它几乎总是最快的,而且显然最容易理解”。既快又容易理解,何乐而不为?工作中我们还有其它的理由要将C==(A|B)这样的正则表达式拆为A和B两条表达式分别执行。例如,虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配,但是如果只要有一条子表达式(例如A)会产生误匹配,那么不论其它的子表达式(例如B)效率如何之高,范围如何精准,C的总体精准度也会因A而受到影响。


目录

参考

[1]: http://www.jb51.net/article/67628.htm
[2]: http://www.williamlong.info/archives/433.html
[3]: http://www.jb51.net/tools/regex.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值