【问题标题】:Regular Expression block negation正则表达式块否定
【发布时间】:2013-01-26 23:12:25
【问题描述】:

我想找出其中没有出现特定标签的字符串,例如:

<xyz>[\w]+<[^(unwanted)]></xyz>

其中unwanted 将被解释为adentu。但我想要的是一个块字符串。如何用正则表达式表达? 我尝试过负前瞻,但不起作用:

<xyz>.+(?!unwanted).+</xyz>

【问题讨论】:

    标签: objective-c regex regex-negation nsregularexpression


    【解决方案1】:
    <xyz>(?:(?!unwanted).)+</xyz>
    

    匹配&lt;xyz&gt;...&lt;/xyz&gt; 中的所有字符,但前提是表达式unwanted 不从其中任何一个字符开始。

    【讨论】:

    • cHao,非常感谢您回答这个难题。但是,答案也很困难。解决方案让我大吃一惊。只是想检查一下我的理解,尽管是命令(?!不想要的)。或 .(?!unwanted),它不会改变效果,对吧?为什么使用 (?:)+ ?这是否意味着除了“不想要的”之外的任何字符,它位于单个字符的位置?
    • (?:...) 将里面的东西分组,但不捕获它。如果你不关心捕获,你可以直接说(...),但这有点浪费。无论哪种方式,关键是使+ 应用于整个事物,因此它将匹配不是表达式unwanted 开头的任何字符。至于整个事情,它的工作原理是这样的:它尝试匹配的每个字符,它首先执行否定的前瞻((?!...))以确保表达式unwanted 不会在那里匹配。如果不是,那么它会抓取该字符并再次尝试下一个。
    • 如果没有(?:...)(或可选的(...)),+ 将仅适用于.,您最终会匹配任何不符合unwanted开始。但是,结果匹配在第一个字符之后的任何地方仍然可以有unwanted。这就是您要在每个位置进行测试的原因(因此,您将前瞻和. 组合在一起)。
    • 更改前瞻顺序和. 确实会影响结果,至少在一个主要方面——因为使用.(?!...) 你会抓住一个字符然后然后 寻​​找unwanted,该模式仍可能出现在字符串的开头而您看不到它。这就是为什么你要检查之前你抓住一个字符。
    • 非常感谢。我知道它现在是如何工作的。你真可爱。这个问题在我脑海里已经有 2 年了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2011-07-09
    • 2016-01-21
    相关资源
    最近更新 更多