iuap-design/blog

正则深入

Opened this issue · 0 comments

正则深入

在前几天的工作中需要确定一个字符串是否是html片段,一下就想到正则最简单啊,然而到写的时候发现,正则已然忘的差不多了,就趁此机会恶补了一下,准备周末总结一下,然而准备写的时候,发现正则已有同事写过了,在此,就总结一些同事没有提到的,作为同事正则的一个补充吧。

问号(?)

“?”在正则中表示的意思非常多,大概有4中情况:

  • 1、“?”放在实意字符之后是量词,表示前面一个字符出现0-1次。
var reg=/a?/;//表示a出现0-1次
  • 2、“?”放在量词的后边表示非贪婪匹配。
var str = 'aaaabcd';
var reg=/a+/;//匹配str可匹配4个a
var reg1=/a+?/;//匹配str只能匹配一个a
  • 3、“?”和“:”组合,在“()”(分组)中表示匹配不捕获。
(?:表达式) //表示在用正则的exec方法时,不会捕获此子正则中的内容
  • 4、正向预查(?=)和负向预查(?!);分别表示前面表达式的成立的条件和不成立时的条件
var reg=/aaa(?=b)/;
var reg1=/abc(?!d)/;
var str=/aaab/;
var str1=/abcd/
reg.exec(str);//返回["aaa"]
reg1.exec(str1);//返回null

在正则中表示“或”的含义的符号有两个“[]”和“|”;其中有一些值得注意的地方;

  • “|”表示该“|”符号左边的所有的表达式或者右边所有的表达式,它的左边是一个整体,右边也是一个整体。
var reg=/^g|food$/;//表示以“g”开头或者以“food”结尾
var reg1=/^(g|f)ood$/;//表示“good”或“food”
  • [1-9]表示1到9,[1-16]表示1和6。
  • []中用“-”表示的是ASCII码中顺序的字符,如
var reg=/[!-)]/;
reg.test("$");//true
  • [^]表示所有非空字符串,不是非空格。
  • 在正则中具有特殊含义的字符在[]中转换为其本身含义,如[.]表示“.”(点)本身,不代表所有字符。

    exec方法的lastIndex属性

    先看例子:
var reg=/(\w)(\w)(\w)/;
var str="abc.defghijklmn.xyz";
var ary=reg.exec(str);
console.log(ary);//结果为["abc", "a", "b", "c", index: 0, input: "abc.defghijklmn.xyz"]
ary=reg.exec(str);
console.log(ary);//结果同上
ary=reg.exec(str);
console.log(ary);//结果同上
var reg=/(\w)(\w)(\w)/g;
var str="abc.defghijklmn.xyz";
var ary=reg.exec(str);
console.log(ary);//结果为["abc", "a", "b", "c", index: 0, input: "abc.defghijklmn.xyz"]
ary=reg.test(str);
console.log(ary);//结果为true
ary=reg.exec(str);
console.log(ary);//结果为["ghi", "g", "h", "i", index: 7, input: "abc.defghijklmn.xyz"]
ary=reg.exec(str);
console.log(ary);//结果为["jkl", "j", "k", "l", index: 10, input: "abc.defghijklmn.xyz"]

由以上两个例子可以明显的看出,在正则加上了“g”修饰符之后,每次执行exec方法(也可以是test方法)之后,下次匹配的起点会更改,那如何知道从何时开始的呢,那就是正则的lastIndex属性发挥作用了,前提是正则拥有了“g”修饰符,值得注意的是lastIndex是正则对象的属性,而例子中控制台输出的是执行正则方法后得到的数组(例子中ary)的属性。