【问题标题】:RegEx .NET match string C where string A OR B are not presentRegEx .NET 匹配字符串 C,其中字符串 A OR B 不存在
【发布时间】:2016-11-21 19:13:28
【问题描述】:

我以为我知道一两件事……然后我遇到了 RegEx。 所以我想做的是多字符串负前瞻?那是一回事吗? 基本上我想找到第三个字符串何时存在但两个前导字符串不存在。

(?i:<!((yellow thing)\s(w+\s+){0,20}(blue thing))\s(\w+\s+){0,100}(green thing))

目标字符串:

  • 这里有一个黄色的东西。这里我们有一个蓝色的东西。显然,绿色的东西是最好的。 (不应匹配)
  • 你想买一些死亡棒吗?我有一个绿色的东西。 (比赛)
  • 我们在一艘黄色的潜艇上?看那边那个绿色的东西! (比赛)

【问题讨论】:

  • 你毁掉了后向,把它变成了一个带有内联修饰符的选项组。试试(?&lt;!yellow thing\W*(\w+\W+){0,20}\W*blue thing\W*(\w+\W+){0,100})green thing。可以在“事物”周围添加单词边界以仅匹配整个单词。

标签: .net regex negative-lookahead


【解决方案1】:

试试这个:

^(?:(?!\byellow thing\b.*?\bblue thing\b).)*\bgreen thing\b

演示:https://regex101.com/r/dL0uZ1/2

解释:

【讨论】:

    【解决方案2】:

    我将这个问题理解为试图仅匹配 c inside 字符串,而不是整个字符串,使用无限宽度的负向查找。

    您在? 之后插入i: 破坏了后视结构,并且您错过了“单词”之间可能存在非单词字符的事实。

    因此,你需要

    (?<!yellow thing\W*(?:\w+\W+){0,20}\W*blue thing\W*(?:\w+\W+){0,100})green thing
    

    查看regex demo,我在其中添加了数字来模拟匹配之间可选单词的数量。

    注意:您可以在things 周围添加单词边界,以仅将它们作为整个单词进行匹配 - 这取决于您的要求。

    另外,您可以将所有捕获组 (\w+\W+) 变为非捕获组以保持这些组堆栈空闲(无需跟踪这些组捕获的内容,对吗?)如果您需要捕获它们,请保持捕获组完整.

    结果:

    【讨论】:

    • 啊!很不错。我看到了我的方式的错误。谢谢你,先生。我也使用了 ?i 因为它忽略了大小写。 (?i:(?
    • 当使用Regex 方法的模式时,您可以只使用RegexOptions.IgnoreCase 标志。
    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2015-12-18
    • 2010-11-22
    • 1970-01-01
    • 2021-09-29
    • 2019-03-14
    • 2021-06-02
    相关资源
    最近更新 更多