Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

正则深入 #116

Open
syygithub opened this issue Aug 21, 2016 · 0 comments
Open

正则深入 #116

syygithub opened this issue Aug 21, 2016 · 0 comments

Comments

@syygithub
Copy link

正则深入

在前几天的工作中需要确定一个字符串是否是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)的属性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant