簡體   English   中英

如何反轉正則表達式組捕獲邏輯?

[英]How to invert the regular expression group capture logic?

要在正則表達式中創建捕獲組,請使用(match)並在其前面加上?:以使其無法捕獲,例如(?:match) 問題是,在任何一種復雜的正則表達式中,我發現自己想要創建的非捕獲組比捕獲組多得多,所以我想顛倒這個邏輯,只捕獲以?: (或其他什么)開頭的組。 我怎樣才能做到這一點? 我主要在 .NET 中使用正則表達式,但我不介意使用正則表達式的其他語言(如 Perl、PHP、Python、JavaScript 等)的答案。

在支持命名捕獲組的任何語言中,您可以簡單地將它們用於您想要捕獲的內容,而忽略編號的。

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

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

say "Version: $+{ver}";

在正則表達式之后,捕獲在%+哈希中可用,在正則表達式中的\\k<name>\\g{name}

缺點是您仍然捕獲所有其他內容(這會稍微影響效率),而優點是您仍然捕獲所有其他內容(這有助於靈活性,如果需要的話)。

如果您想避免(?: )的笨拙並將( )組轉換為非捕獲組,請使用RegexOptions.ExplicitCapture選項。 如果使用此選項,則只會捕獲命名組 ( (?<name>subexpression) )。

但是,不幸的是,您不能將非捕獲組(?: )轉換為捕獲組。

RegEx 構造函數以及來自 RegEx 類的其他方法接受RegexOptions標志。

例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM