谈谈js中的正则表达式第一篇之正向肯定预查和正向否定预查

来源:互联网 发布:军警大衣淘宝网 编辑:程序博客网 时间:2024/05/21 09:59

之前在别人写的瀑布流案例中,发现有这样的正则写法:/<a(?:.|\n|\r|\s)*?a>/gi  

对于?: 的正则表示方法没有看到过,一下子蒙了,决定好好补充下正则表达式的知识。

引用维基百科对正则表达式的概念,正则表达式的意思是使用单个字符串来描述、匹配一系列符合某个语句规则的字符串搜索模式。

一、?:pattern

(?:pattern)会作为匹配检验,并出现在匹配字符结果里面,但是跟(...)的区别是,它不作为子匹配返回;

这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

例1:industry.match(/industr(?:y|ies)/i)           //   ["industry", index: 0, input: "industry"] 

  industry.match(/industr(y|ies)/i)            //  ["industry", "y", index: 0, input: "industry"]

可以注意到  第一个正则匹配返回的结果中没有子匹配的返回内容


二、?=pattern

(?=pattern)  正向肯定预查     会作为匹配校验,是一个非获取匹配,不会出现在匹配结果字符串里面

例2:  windows2000.match(/windows(?=2000|2005)/ig  // [windows]


三、?!pattern

(?!patter)  正向反向预查   在任何不匹配pattern的字符串开始处匹配查找字符串,也是一个非获取匹配,不会出现在匹配结果字符串里面

例3:windows2000.match(/windows(?!2000|2005)/g)  //null

   windows2000.match(/windows*(?!2000|2005)/g)   //[window]


解释下最后一个例子:*在正则表达式中的意思是匹配前一个子表达式0次或者多次,

例如zo*可以匹配z 、zo  、zoo  


windows2000.match(/windows*(?!2000|2005)/g)  中  windows*可以匹配window ,s2000  匹配的是(?!2000|2005)



注:本文参考文:https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F




原创粉丝点击