正则过于重要(最近越来越多用到:Java的split函数、js、nginx的配置、Linux),但是我基本8会写,所以一边学一边记录下。
工具/网站安利
- RegExp Tester:一个用于测试的chrome扩展,体积小且方便。
- regexone:交互式学习和练习正则表达式的网站。
部分基础语法
(PS:因为我就看会了这点,有不对的还请各位大佬指出,也可能手抖敲错了
元字符
\b
:代表着单词的开头或结尾,也就是单词的分界处,它只匹配一个位置。\w
:匹配字母或数字或下划线或汉字。\d
:匹配数字,可以代替0到9之间的任何数字。.
:匹配任何单个字符(字母,数字,空格,所有内容),实际上会覆盖句号字符的匹配,因此,为了专门匹配句号,使用斜杠\
来使句号转义。\s
:匹配任意的空白符。^
:匹配字符串的开始。$
:匹配字符串的结束。()
:小括号来指定子表达式(也叫做分组),然后可以对这个表达式指定各项操作。
转义
查找元字符本身需要
\
转义,例:regtest\.py
匹配regtest.py
。C:\\Windows
匹配C:\Windows
。
反义
\B
:匹配不是单词开头或结束的位置。\W
:匹配任意不是字母,数字,下划线,汉字的字符。\D
:匹配任意非数字的字符。\S
:匹配任意不是空白符的字符。[\^x]
:匹配除了x以外的任意字符。[\^aeiou]
:匹配除了aeiou这几个字母以外的任意字符。
例:\S+
:匹配不包含空白符的字符串。<a[^>]+>
:匹配用尖括号括起来的以a开头的字符串。
重复
*
:重复零次或更多次D+
:重复一次或更多次?
:重复零次或一次{n}
:重复n次{n,}
:重复n次或更多次{n,m}
:重复n到m次
例:
Windows\d+
:匹配Windows后面跟1个或更多数字。\^\w+
:匹配 一行的第一个单词(或整个字符串的第一个单词)。
字符范围
[]
表示法中:-
:表示字符范围。^
:表示不要某几个字符。
例:[0-6]
:仅会匹配从零到六个的任何一位数字字符。[^ np]
:将仅匹配任何单个字符,但字母n至p除外。
后向引用、分组、捕获
默认情况下,每个分组会自动拥有一个组号,规则 是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
捕获(exp)
:匹配exp,并捕获文本到自动命名的组里。(?exp)
:匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
。(?:exp)
:匹配exp,不捕获匹配的文本,也不给此分组分配组号。(PS:不会改变正则表达式的处理方式,只是这样的组匹配的内容 不会像前两种那样 被捕获到某个组里面,也不会拥有组号。
零宽断言(?=exp)
:匹配exp前面的位置(?<=exp)
:匹配exp后面的位置(?!exp)
:匹配后面跟的不是exp的位置(?<!exp)
:匹配前面不是exp的位置
注释(? #comment)
:这种类型的分组不对正则表达式的处理产生任何影响,用于提 供注释让人阅读
懒惰匹配
匹配尽可能少的字符
*?
:重复任意次,但尽可能少重复+?
:重复1次或更多次,但尽可能少重复??
:重复0次或1次,但尽可能少重复{n,m}?
:重复n到m次,但尽可能少重复{n,}?
:重复n次以上,但尽可能少重复
常用的部分正则表达式
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
。
只能输入数字:^[0-9]*$
。
只能输入n位的数字:^\d{n}$
。
只能输入至少n位的数字:^\d{n,}$
。
只能输入m到n位的数字:^\d{m,n}$
。
只能输入零和非零开头的数字:^(0|[1-9][0-9]*)$
。
只能输入有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
。
只能输入有1到3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
。
只能输入非零的正整数:^\+?[1-9][0-9]*$
。
只能输入非零的负整数:^\-[1-9][]0-9″*$
。
只能输入长度为3的字符:^.{3}$
。
只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
。
只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
。
只能输入由26个小写英文字母组成的字符串:^[a-z]+$
。
只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
。
只能输入由数字、26个英文字母或者下划线组成的字符串:^\w+$
。
验证用户密码:^[a-zA-Z]\w{5,17}$
。
正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&’,;=?$\
等字符:[^%&',;=?$\x22]+
。
只能输入汉字:^[\u4e00-\u9fa5]{0,}$
。
验证Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
。
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
。
验证电话号码:
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
。
正确格式为:XXX-XXXXXXX
、XXXX-XXXXXXXX
、XXX-XXXXXXX
、XXX-XXXXXXXX
、XXXXXXX
和XXXXXXXX
。
验证身份证号(15位或18位数字):^\d{15}|\d{18}$
。
验证一年的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″。
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
。
匹配双字节字符(包括汉字在内):[^\x00-\xff]
。
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,”aa”).length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配html标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
匹配首尾空格的正则表达式:
(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, “”);}
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:function IP2V(ip){re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error(“Not a valid IP address!”)}}
//上面的程序直接用split函数来分解 var ip=”10.100.20.168″ip=ip.split(“.”)alert(“IP值是:”+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:
onkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))”
用正则表达式限制只能输入全角字符:
onkeyup=”value=value.replace(/[^\uFF00-\uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))”
用正则表达式限制只能输入数字:
onkeyup=”value=value.replace(/[^\d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”
用正则表达式限制只能输入数字和英文:
onkeyup=”value=value.replace(/[\W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:\n\s*\r
可以用来删除空白行匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
(仅对部分简单情况适用)
匹配首尾空白字符的正则表达式:^\s*|\s*$
可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
表单验证时很实用匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
表单验证时很实用匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
匹配形式如 0511-4405222
或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
从10000开始匹配中国邮政编码:[1-9]\d{5}(?!\d)
中国邮政编码为6位数字
匹配ip地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
匹配正整数^-[1-9]\d*$
匹配负整数^-?[1-9]\d*$
匹配整数^[1-9]\d*|0$
匹配非负整数(正整数 + 0)^-[1-9]\d*|0$
匹配非正整数(负整数 + 0)^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
匹配正浮点数^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
匹配负浮点数^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
匹配浮点数^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
匹配非负浮点数(正浮点数 + 0)^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
匹配非正浮点数(负浮点数 + 0)^[A-Za-z]+$
(处理大量数据时有用,具体应用时注意修正匹配特定字符串)
匹配由26个英文字母组成的字符串^[A-Z]+$
匹配由26个英文字母的大写组成的字符串^[a-z]+$
匹配由26个英文字母的小写组成的字符串^[A-Za-z0-9]+$
Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/
isEmail1 : /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/;
isEmail2 : /^.*@[^_]*$/;
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/
发表评论