程序员

正则表达式之匹配不存在特定字符的字符串

2018-06-05  本文已影响1051人  Lee_5566

作为一名不经常使用正则表达式的程序员,想用最简单的语言来描述否定匹配,不过发现确实不是那么好理解。还是按照自己知道的来描述吧。

正则规则描述

[ ] :表示范围,匹配其中任何一个
{ }:表示重复匹配多次。
( ): 表示分组,意思就是括号内是一个整体。

关于匹配

(?:pattern)

非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例>>如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern)

非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

(?<=pattern)

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?<!pattern)

非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题

这些都是来源于网上,前人已经总结的很好了。前人栽树,后人乘凉。我就乘乘凉好了。O(∩_∩)O哈哈~

本次使用 (?!pattern) 匹配,显而易见它是匹配下一个字符串来判断本次的匹配是否成功。当然这是一个否定匹配。

问题

在文档中匹配出,不包含“hello”的字符串。

mm,bn,hello,ssdenl.
sdfsdf,dfdf,dfdfe,ggg.
sdfd,gfgf
dfdfgfgdfgsdfgsdfg
dfgfdg,sdfsdfdhello.sdfasdfas/
sdfsdfdfgdfgdsfhellosdfasdfasdf
sdfasdfdfgffghjdkfjglfdg

其中第1,5,6行包含有“hello”字符串。当然这不是重点,重点是怎么来写这个正则表达式。
当然,结论是:

^(?!.*hello).*$

运行效果:


image.png

将包含有“hello”的字符串全部排除掉了。这样就实现了我们想要的效果。
_

简明解释一下,这个语句的意思:
从头开始匹配,否定匹配任意字符到“hello”,然后匹配任意字符到尾部结束。

大功告成,回家睡觉。O(∩_∩)O哈哈~

上一篇下一篇

猜你喜欢

热点阅读