【问题标题】:regex - Start to match after certain pattern正则表达式 - 在特定模式后开始匹配
【发布时间】:2018-05-01 04:40:13
【问题描述】:

我在尝试使用正则表达式查找内容时遇到问题。

我有以下正则表达式

([{\-\+~a-zA-Z0-9]+){3,}

它可以正常工作,但是,我需要在某个字符之后捕获所有可能的匹配项,在本例中为}

faz.}a..sd..3·$....................foo....e..P...0...................bar

foobar 必须匹配,但 faz 不应该匹配。请注意,我不能使用.+(?=}),因为它会将} 之后的所有内容捕获到单个匹配项中。我在互联网上搜索,每个答案都暗示了这种模式。

提前致谢。

【问题讨论】:

  • 环境是什么?工具?编程语言?试试[-{+~a-zA-Z0-9]{3,}(?![^}]*})
  • 我目前正在 Regex101 (pcre) 中进行测试,如果可行,我将在 C# 中实现它。
  • 啊哈,那是用错网站了。 PCRE 与 .NET 正则表达式不同。但是上面的建议在两种口味中都是一样的。在 .NET 中,您也可以使用 (?<=}.*)[-{+~a-zA-Z0-9]{3,}

标签: .net regex


【解决方案1】:

在 .NET 中,您可以使用正的可变长度后视来匹配仅在某个字符/子字符串/模式之后出现的模式:

(?<=}.*)[-{+~a-zA-Z0-9]{3,}
^^^^^^^^

regex demo

详情

  • (?&lt;=}.*) - }(以及除换行符以外的任何 0+ 字符)应出现在随后的 cosuming 模式部分之前
  • [-{+~a-zA-Z0-9]{3,} - 字符类中列出的字母、数字和一些标点/符号字符出现 3 次或更多次。

你也可以检查一个相反的方法:匹配你需要的单词,如果它们后面没有}

[-{+~a-zA-Z0-9]{3,}(?![^}]*})

this regex demo

这里,(?![^}]*}) 是一个否定的前瞻,如果在与 [-{+~a-zA-Z0-9]{3,} 模式匹配的“单词”右侧紧邻除 } 之外的任何 0+ 个字符之后有一个 },则匹配失败。

【讨论】:

    【解决方案2】:

    通过简化和快速的CaptureCollection一次性获取所有内容

    (?s)}(?:.*?([{\-+~a-zA-Z0-9]{3,}))+

    阅读版本

     (?s)
     }
     (?:
          .*? 
          ( [{\-+~a-zA-Z0-9]{3,} )      # (1)
     )+
    

    C#

    string inp = @"faz.}a..sd..3·$....................foo....e..P...0...................bar";
    Regex Rx1 = new Regex( @"(?s)}(?:.*?([{\-+~a-zA-Z0-9]{3,}))+" );
    Match M1 = Rx1.Match( inp );
    if ( M1.Success )
    {
        CaptureCollection cc = M1.Groups[1].Captures;
        for (int i = 0; i < cc.Count; i++)
            Console.WriteLine("{0}", cc[i].Value);
    }
    

    输出

    foo  
    bar  
    Press any key to continue . . .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多