如何反转正则表达式组捕获逻辑?

时间:2018-11-12 21:37:24

标签: c# python .net regex perl

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

2 个答案:

答案 0 :(得分:3)

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

但是,不幸的是,您无法将非捕获组(?: )变成捕获组。

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

例如:

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

答案 1 :(得分:3)

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

my $string = q(Available from v5.10 in Perl.);

$string =~ /([A-Z].+?)(?<v>[0-9.]+)\s+(.*?)\./;

say "Version: $+{v}";

在正则表达式之后,%+哈希中的捕获可用,在\k<name>\g{name}中的正则表达式中可用。

缺点是您仍然会捕获所有其他东西(对效率有一点损害),而缺点是您仍然会捕获所有其他东西(如果需要的话,这对灵活性很有帮助)。