要在正则表达式中创建捕获组,请使用(match)
,并在其前面加上?:
以使其不捕获,例如(?:match)
。问题是,在任何复杂的正则表达式中,我发现自己想要创建比捕获组更多的非捕获组,因此我想颠倒这种逻辑,仅捕获以?:
开头的组(或其他任何捕获组) )。我怎样才能做到这一点?我主要在.NET中使用正则表达式,但是我不介意使用正则表达式(例如Perl,PHP,Python,JavaScript等)的其他语言的答案。
答案 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}
中的正则表达式中可用。
缺点是您仍然会捕获所有其他东西(对效率有一点损害),而缺点是您仍然会捕获所有其他东西(如果需要的话,这对灵活性很有帮助)。