js之正则表达式

全称:Regular expressions,简称RegExp;
作用:RegExp 对象用于规定在文本中检索的内容。
创建的两种方法:
1.普通方式:var reg=/表达式/附加参数
表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符,来代表特殊的规则,后面会详细说明。
附加参数:用来扩展表达式的含义,目前主要有三个参数:
g:代表可以进行全局匹配。
i:代表不区分大小写匹配。
m:代表可以进行多行匹配。
上面三个参数,可以任意组合,代表复合含义,当然也可以不加参数。
例子:
var reg=/a*b/;
var reg=/abc+f/g;
2.构造函数方式:var reg=new RegExp(“表达式”,”附加参数”);
例子:
var reg=new RegExp(“a*b”);
var reg=new RegExp(“abc+f”,”g”);

普通方式与构造函数方式的区别
1.普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,也可以是一个js变量,例如根据用户的输入来作为表达式参数等等:
var reg=new RegExp(document.forms[0].exprfiled.value,”g”);
2.一定要注意一点,构造函数参数都是以双引号包裹的字符串,无需正斜杠包裹。 如果采用正则对象方式,RegExg接收的是字符串,\反斜杠是转义字符,\d会变成d,此时需要使用两个反斜杠,即\d来达到\d效果;但是在字面量方式中,不是字符串,所以使用一个反斜杠即可;
工具:
http://tools.jb51.net/regex/javascript

二、难点
1.(?:pattrn) 匹配 pattrn 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘inustr(?:y|is) 就是一个比 ‘inustry|inustris’ 更简略的表达式。
举个例子:

var rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i;  
//打印true,\s*是贪婪匹配,表示直接跳到空格的最后,也就是跳过所有的空格,接着去匹配后面的字符!如果后面没有匹配到,那么就回溯!  
alert(rchecked.test("checked "));  
//打印true,因为是贪婪匹配,那么\s*会直接跳过所有的空格去匹配后面的字符,如果没有匹配到就会回溯,所以这里的等号前后可以有任意多的空格!  
alert(rchecked.test("checked=xcheckedx"));  

//打印checked a 
alert("checked a=xchecked".match(rchecked));  
//打印checked a,a
var rchecked = /checked\s*([^=]|=\s*.checked.)/i; 
alert("checked=xchecked".match(rchecked));  

就是不保存后面的,a,应该就是这个差别吧;
2.(?=pattrn) 正向预查,在任何匹配 pattrn 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, ‘Winws (?=95|98|NT|2000)’ 能匹配 “Winws 2000” 中的 “Winws” ,但不能匹配 “Winws 3.1” 中的 “Winws”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

3.(?!pattrn) 负向预查,在任何不匹配Ngativ lkaha maths th sarh string at any pint whr a string nt mathing pattrn 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Winws (?!95|98|NT|2000)’ 能匹配 “Winws 3.1” 中的 “Winws”,但不能匹配 “Winws 2000” 中的 “Winws”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

4.在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
1.\ 转义符 2.(), (?:), (?=), 圆括号和方括号 3.*, +, ?, {n}, {n,}, {n,m} 限定符 4.^, $, \anymtaharatr 位置和顺序 5.|“或”操作
要注意的是|是最后一个优先级,因此并不是挨着|的先运行

5.如果在[]字符集合里,很多字符都不需要转义,这个需要注意一下,朱转义也可以;
误区:
1.要正确理解字符串加引号之后的转义和正则表达式的转义,不能把这两者搞混了;他两的功能是完全不同的:正则表达式中的字符什么的是为了匹配其对应的内容,所以会有一些什么特殊含义,而字符串的转义只是简单的把一些特殊字符在引号中表达出来而已;
而且需要非常注意的一个地方就是正则表达式的RegExp后面接的是字符串,所以需要双重解析,反过来说,也就是需要将真正需要的东西双重转义;
2.通常情况下转义字符“\”后面接普通字符时转义的都是其本身,除了正则表达式已经规定好的一些特殊含义的字符;
3.混淆了一个事:正常字符串中双引号时,我们确实计算的反斜杠“\”是转义字符,以至于在正则表达式中想要得到“\”需要这个“\\”才可以,这个其实就是正则表达式的字符串和一般字符串的不同之处,正常字符串转义完就完事了,不需要用转义完的“\”再进行运算,而正则表达式则是在字符串解析完之后再进行一次匹配,等于匹配了两次,这就是它们的根本区别;String的“”和new RegExp(“”)中的“”是不同的;
4.js字符串中的反斜杠其实代表着转义,想要用就得\,要不然如果出现在字符串里面,应该是要直接转义为unicode值的;如“\u2213”其实就代表着一个字符;所以最后得看你想得到的究竟是那个字符“\u2213”->对应字符,还是这个编码值“\u2213”->\u2213
正则表达式说起来太多了,只能是每次用的时候都查,这儿有个哥们写的很全,除了把反斜杠写成斜杠之外,其它还是很全的。
网址:http://blog.csdn.net/zaifendou/article/details/5746988
http://www.jb51.net/article/72346.htm
前两天看到一个不错的东西,也是正则表达式的,就把网址先记一下吧
网址:http://www.jianshu.com/p/e7bb97218946
http://deerchao.net/tutorials/regex/regex-1.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值