正则表达式

212 阅读3分钟

正则表达式

正则表达式(regular expression) 是用来检查一个字符串中是否包含有某字符串、将匹配的字符串替换或取出符合条件的字符串。

很多基本的操作可能大家都用的比较多了,所以就不啰嗦。今天主要来说说分组、正向零宽断言及反向零宽断言。

分组

分组是用圆括号"()"括起来的正则表达式,匹配到的内容就表示一个分组。

分组跟捕获在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用圆括号()完成:

  • (exp) :分组,并捕获该分组匹配到的文本内容,系统默认用索引进行区分 RegExp.$1, RegExp.$2
  • (?<custumName>exp): 分组,并捕获该分组匹配到的文本内容,系统默认用索引进行区分RegExp.$1 RegExp.$2,使用custumName 为别名,别名会归属到groups属性中,用别名就行引用该分组内容
  • (?:exp) :分组,并不捕获该分组匹配到的文本内容

(exp):

<script>
    let reg = /(\d{4})-(\d{2})-(\d{2})/;
    let date = "2020-07-10";

    console.log(date.match(reg));
    console.log(RegExp.$1);
    console.log(RegExp.$2);
    console.log(RegExp.$3);
</script>

结果:

(?<custumName>exp):对比(exp),我们可以通过gounps获取我们别人的值

<script>
    let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
    let date = "2020-07-10";

    let matchs = date.match(reg);
    console.log(matchs);
    console.log("RegExp.$1", RegExp.$1);
    console.log("RegExp.$2", RegExp.$2);
    console.log("RegExp.$3", RegExp.$3);

    console.log("year", matchs.groups.year);
    console.log("month", matchs.groups.month);
    console.log("day", matchs.groups.day);
</script>

(?:exp): 不捕获该分组匹配到的文本内容,如年份 2020

<script>
    let reg = /(?:\d{4})-(\d{2})-(\d{2})/;
    let date = "2020-07-10";

    let matchs = date.match(reg);
    console.log(matchs);
</script>

结果:

零宽断言

零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。 作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功。

正向零宽断言

断言自身出现的位置的后面能匹配表达式exp

  • (?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。通俗来说,定义目标字符串起始位置要求,即紧邻目标字符串后面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组。
  • (?!exp) 与(?=exp)取反,定义目标字符串起始位置要求,即紧邻目标字符串后面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组。

(?=exp):

<script>
    let reg = /iphone(?=\d+)/gi;
    let str = "iphone4s iphone5 iphone6 iphone7 iphonex";

    console.log(str.replace(reg, '苹果'))
</script>

结果为:

苹果4s 苹果5 苹果6 苹果7 iphonex

反之,(?!exp):

<script>
    let reg = /iphone(?!\d+)/gi;
    let str = "iphone4s iphone5 iphone6 iphone7 iphonex";

    console.log(str.replace(reg, '苹果'))
</script>

结果:

iphone4s iphone5 iphone6 iphone7 苹果x

负向零宽断言

断言自身出现的位置的前面能匹配表达式exp

  • (?<=exp) 零宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp。通俗来说,定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串需要匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组。
  • (?<!exp) 与(?<=exp)取反,定义目标字符串起始位置要求,即紧邻目标字符串前面出现的字符串不能匹配上exp表达式,该字符串不会被计入目标字符串,表达中出现的括号也不会被视作一个分组。

(?<=exp):

<script>
    let reg = /(?<=\d+)cm/gi;
    let str = "10cm 5cm 6cm 7cm 八cm";

    console.log(str.replace(reg, '厘米'))
</script>

结果为:

10厘米 5厘米 6厘米 7厘米 八cm

反之,(?<!exp):

<script>
    let reg = /(?<!\d+)cm/gi;
    let str = "10cm 5cm 6cm 7cm 八cm";

    console.log(str.replace(reg, '厘米'))
</script>

结果:

10cm 5cm 6cm 7cm 八厘米

如有误,请多多指点,谢谢!