【问题标题】:How to invert the regular expression group capture logic?如何反转正则表达式组捕获逻辑?
【发布时间】:2019-04-15 15:55:49
【问题描述】:

要在正则表达式中创建捕获组,请使用 (match) 并在其前面加上 ?: 以使其不被捕获,例如 (?:match)。问题是,在任何一种复杂的正则表达式中,我发现自己想要创建比捕获组更多的非捕获组,所以我想颠倒这个逻辑,只捕获以?:(或其他)开头的组。我怎样才能做到这一点?我主要在 .NET 中使用正则表达式,但我不介意使用 Perl、PHP、Python、JavaScript 等正则表达式的其他语言的答案。

【问题讨论】:

  • 您也许可以使用RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…) 实例化您的 RegEx 对象
  • @elgonzo 看起来不错,如果你把它作为我可以接受的答案。

标签: c# python .net regex perl


【解决方案1】:

如果您想避免(?: ) 的笨拙性并将( ) 组变成非捕获组,请使用RegexOptions.ExplicitCapture 选项。如果使用此选项,则只会捕获命名组 ((?<name>subexpression))。

但是,很遗憾,您不能将非捕获组 (?: ) 转换为捕获组。

RegEx 构造函数以及 RegEx 类中的其他方法接受 RegexOptions 标志。

例如:

Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)

【讨论】:

    【解决方案2】:

    在任何支持named capture groups 的语言中,您都可以简单地将它们用于您想要捕获的内容,而忽略编号的。

    my $string = q(Available from v5.10 in Perl.);
    
    $string =~ /([A-Z].+?)(?<ver>[0-9.]+)\s+(.*?)\./;
    
    say "Version: $+{ver}";
    

    在正则表达式之后,捕获在 %+ 哈希中可用,在 \k&lt;name&gt;\g{name} 的正则表达式内。

    缺点是您仍然会捕获所有其他内容(这会稍微损害效率),而好处是您仍然会捕获所有其他内容(有助于灵活性,如果需要的话)。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多