美文网首页程序员
正则表达式之匹配不存在特定字符的字符串

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

作者: Lee_5566 | 来源:发表于2018-06-05 08:11 被阅读1051次

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

    正则规则描述

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

    关于匹配

    (?: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哈哈~

    相关文章

      网友评论

        本文标题:正则表达式之匹配不存在特定字符的字符串

        本文链接:https://www.haomeiwen.com/subject/qgcesftx.html