现在的位置: 首页 > 综合 > 正文

Javascirpt正则表达式知识归纳

2013年12月13日 ⁄ 综合 ⁄ 共 2700字 ⁄ 字号 评论关闭

当哥还推荐了一篇文章给我:

http://blog.sina.com.cn/s/blog_4acf752f0100omrt.html

(1)

test(  )方法   和 exec(  )方法一样,都是正在写在前面

var reg=new RegExp("abc"),alert(re.test("abcd")),这个时候会返回true。

(2)
var a=/^ab/;      alert(a.test("bbs adad")),注意^表示整个字符串的开头,这里的“bbs adad”貌似第2段字符串是ab开头的,但仍然不行,只有“abbs adad”这样在整个字符串的开头才行。
(3)

\s,匹配空格字符,制表符,换页符等。

\w,字母,数字,下划线都可以匹配,相等于[a-zA-Z0-9_],别忘记下话划线。

\d,只匹配数字,效果等同于[0-9]

.号可以匹配任何的东西,除了换行符,如果要匹配点号自己可以用\.进行转义,也可以直接用点号自己匹配自己。
var re=/^.$/,re.test("\n")返回为false,也即是换行符没法匹配,会返回假。

(4)

exec(  )和正则中的“()”有很好的配合。

 var a=/(\w+)\s+(\d+)/;

var f=a.exec("b d1");  // 返回null,这里是个整体匹配。。

var f=a.exec("b 1");    //  正确

alert(f)     // 结果是b 1,b,1,即结果是一个数组,值分别是全部匹配到的,以及各个组合依次匹配到的。

f[0]的值是“b 1”,f[1]的值是b,f[2]的值是1。

(5)

var patt=/-+/;                          // 匹配“-”号至少一次
var a="---sadsa----";           
var b=a.replace(patt,"@");        // 结果是@sadsa---

    我们可以看到patt可以匹配到"---sadsa----"中前面的“---”,后面的匹配不到,然后将它们替换成为@,于是变成@sadsa---,我一开始还以为会是@@@@sadsa---。


改成:
var
patt=/-+/g          
   

    结果是@sadsa@,g的意思就是全文查找,匹配成功了一次,还会继续匹配。      

改成:var patt=/-/g

    结果是@@@sadsa@@@

(6)

exec()方法和match()方法的异同

两者都可以返回数组。但如果执行exec方法的正则表达式没有分组(没有括号括起来的内容),那么如果有匹配,他将返回一个只有一个元素的数组,这个数组唯一的元素就是该正则表达式匹配的第一个串;如果没有匹配则返回null。也即exec(  )返回数组的情形,是因为正则式子里头有分组的写法。

下面两个alert函数弹出的信息是一样的 :
var str= "cat,hat" ;
var p=/at/; //没有g属性
alert(p.exec(str))
alert(str.match(p))
都是"at"。在这种场合下exec等价于match。

但是如果正则表达式是全局匹配(g属性)的,那么以上代码结果不一样了:
var str= "cat,hat" ;
var p=/at/g;              //注意g属性
alert(p.exec(str))
alert(str.match(p))
结果分别是:
"at"
"at,at"。

var patt=/s/g;  var a="ssadsa";  var b=patt.exec(a);   //结果是s,而不会返回ss,即使有g,虽然进行了全文查找,但是永远只返回第一次匹配成功的。除非改成 var patt=/s+/g,这样的话第一次匹配就匹配到2个s,于是能返回ss。 

(7)

去除两边空白字符,不能/\s+/g,因为这样可能把字符串中间的空白也去掉啦,所以只能操作两次,一次替换头部,一次替换尾巴。头部:/^\s+/,尾巴:/\s+$/。

(8)

    让用户输入1982-08-23这样的格式,用户可能会输入19934#¥·08!2,这样的形式,这时候只要利用split()和正则就可以顺利将字符串劈开,取到我们要的值。

如:string.split(/[^0-9]+/),注意不需要引号,正则外围任何时候都不需要引号。

(9)

search(/\d+/)方法是用来返回查找的字符索引的,功能和indexOf()类似,但后者不可以用正则。search加上g也是没有意义的,因为只返回第一次查找字符的索引。

a.indexOf("f",3),后面这个是指定的查找起始位置。

(10)

test和exec都是正则的方法,replace,split,search,match,这些都是String和正则搭配方法。

(11)

var s="8dsad8dsaas888";
re=/\d+/g;
re.lastIndex=9;
alert(re.exec(s));  // 本来结果是8,后来设置了lastIndex为9,则是从第10个位置开始查找,于是会匹配到888,这个re.lastIndex的作用就是设置匹配的起始位置。

(12)

加了*,+这些量词后,都会尽量匹配多个,但是点号不是量词,它是代表一个任意字符而已。所以遇到点号,也是匹配成功就返回,不会像前两者一样尽量匹配多,除非加上 .*
即点号和星号。。

(13)

/abc/并不能只匹配到abc,可能匹配到fabcm,而如果我们只要匹配一个abc的话,则/^abc$/,这样的话就只匹配abc本身。

(14)

/\d{1,}/,这个是至少要匹配一位,等同于/\d+/。

(15)

量词后面,加问号,变成懒惰模式,如,var s="8899"; re=/\d+/g,没加问号的结果是8899,而加了问号的结果是8,尽量匹配就好乐。 

var s="8899";
re=/\d*?/g;       // 本来星号就是0次或者1次,这里加了问号变成懒惰后,它干脆直接不匹配啦,返回一个空值。

(16)

re=/if|else/,这个要么匹配if,要么匹配else。注意中间的 “|”符号。

re=/(if|emse)\d/,这里匹配if8这样的或者“emse9”这样的。\

(17)

/\da{3}/,注意这个{3}仅对a字母起作用,而非对\da起作用。靠得最近的才行。

(18)

var re=/(\d{3})@(\d{3})/;       
var s="123@563";
var a=re.exec(s);
alert(a);

//这里貌似分组括号没有什么特别的意义,但是它却方便我们提取123和563,因为a[1],a[2]分别是它们的值。注意“-”这个符号,匹配的时候要进行转义。





    

抱歉!评论已关闭.