正则表达式—零宽断言

时间:2022-09-24 06:20:07

什么叫正则表达式?

请看这里:正则表达式
举个简单的应用场景,有的时候我们需要处理字符串(长文本也看做是长字符串~),怎么处理呢,比如查找一篇文章中“和谐”出现的次数和地方,这是最简单的需求。查找完了,我们突然发现“不和谐”中的和谐也被查找到了结果中,于是怎么办呢,我们还要去掉之前结果中的“不和谐”。若是一篇长篇小说,用到这个词的地方很多。手工去查找肯定是很无聊的,尽管类似无聊的事儿我干过- -!

嗯,可以这样理解正则表达式,一个正则是一串符号,这些符号各司其职,组合起来就能对应匹配字符串的内容,只要使用得当,你可以使用正则在任意复杂的字符串环境下找到你心中满意的答案。*是这样说的:一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串

具体的正则的用法,学习什么的就不说,我也没系统学过,平时用到了,就google一下,你能知道的太多了。

什么叫零宽断言?

好吧,回到开头我说的那个和谐的例子。用正则开始可以这样匹配:”[^不]和谐”(编码就不讨论了,这样写直观点儿)  ,这个会多匹配出一个字符,嗯,你可以摆摆手说:“嗯,没事儿,我认了”;而且你没发现要是文本一开头就是“和谐”这词儿,那上面儿那个就不能把它匹配出来了。你还是可以说:“没事儿,不就开头一个嘛,我手动找出来”,好吧这个我对你的忍耐力也有些佩服了。不过我可不是愿意这么妥协的主儿,于是我找啊找,于茫茫网络中看见了“零宽断言”。这是啥呢? 我第一眼看见,心想,哇,这么装13的名字。现在才知道我之前压根儿没明白名字的含义。含义看这儿

现在来说说怎么理解的吧,先说“断言”:断言,可以理解为指定一个位置,该位置满足某种条件。譬如列队的时候,说某某的后面那位。(类似的理解啦)

“零宽”:零宽度,就是没有宽度,不占位。这个相对来理解了,正则中再小的语句部分都会匹配东西(当然如果存在),而零宽则表示不占位,存不存在都不属于匹配到得到的内容。

上面那个例子怎么完成呢?

/(?<!不)和谐/

这个就是应用到“零宽度负回顾后发断言”完成的。
零宽断言分为四种:
    零宽度正预测先行断言

1  /(?=exp)/

其中exp代表表达式,它的使用情形一般是 exp1(?=exp2) 即匹配表达式1且表达式1后面能匹配表达式2,但是表达式2所能匹配的并没有成为匹配项的一部分(零宽度),其名称中的正预测表示表达式的 (?= ) 部分,等号即能匹配、正面的预测,之所以叫预测是因为所要匹配的表达式在改表达式前面、出现之前,所以称之为预测,“先行断言”,因为断言表达式指定的是表达式1前面部分,所以称先行。后面几种以此类推
    零宽度正回顾后发断言

/(?<=exp)/

应用情形 (?<=exp2)exp1 
    零宽度负预测先行断言

 /(?!exp)/

应用情形 exp1(?!exp2) 
    零宽度负回顾后发断言

 /(?<!exp)/

应用情形 (?<!exp2)exp1

下面是我在整理一部分html的时候在sublime编辑器里用到的,因为用这个所以认真的学了学,记录一下~

/<p>(.*?[\n]?.*?(?!<p>)</p>[\s]*<pre)/