![](/img/trans.png)
[英]How to match regular expression group capture collection with another group capture collection?
[英]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.