簡體   English   中英

.NET 正則表達式:獲取所有匹配的組

[英].NET Regex: Get all matched groups

我一直在使用 .NET 遇到正則表達式問題。 例如,我有下一個正則表達式模式: (?'group1'A|C)|(?'group2'B|C)|(?'group3'A|B|C)

當我匹配“ AXYZ ”時,我收到包含值和組的匹配 object; 如果我 go 到組,我會看到只有一個組在 true 中成功 - group1 (group3 為 false)。 如果我匹配“ BXYZ ”,我將只收到group2成功為真(group3 為假)。

我怎么能在比賽中不僅獲得一組,而且獲得滿足比賽的所有組?

例如上面應該是:“AXYZ”中的 group1 和 group3 以及“ BXYZ ”中的 group2 和group3

以上只是實際系統中的示例,有不同的模式(每個 3+ 字母)和更復雜的輸入文本(1000+ 字)。

這個問題似乎有點抽象,但如果你堅持使用一個正則表達式,你可以使用可選的前瞻來做這樣的事情:

(?=(?'group1'A|C)?)(?=(?'group2'B|C)?)(?=(?'group3'A|B|C)?)

Lookaheads 匹配但不捕獲,因此在這種情況下您的匹配將為空,但組將如您預期的那樣,並且可能重疊。

工作示例: http://ideone.com/PTtQu

您那里的正則表達式只會匹配單個字符; 一旦在字符上找到匹配項,正則表達式就會移動到輸入字符串中的下一個字符。 在您的示例中,“B”永遠不會與“group2”或“group3”匹配,因為它始終會與“group1”匹配。 同樣,出於同樣的原因,'A' 永遠不會被 'group3' 匹配。

使用正則表達式獲得所需結果的一種方法是將每個組視為單獨的正則表達式並在每個組上使用Regex.IsMatch() 對於計數,以下 C# 可以滿足我的要求:

string input = "AXYZ";
int count = 0;

count += Regex.IsMatch(input, "A|B") ? 1 : 0;
count += Regex.IsMatch(input, "B|C") ? 1 : 0;
count += Regex.IsMatch(input, "A|B|D") ? 1 : 0;

Console.WriteLine(count); // returns 2

我相信你必須讓正則表達式“貪婪”。 以下是有關它的一些信息:

http://blogs.msdn.com/b/ericgu/archive/2005/08/19/453869.aspx

正則表達式引擎是急切的,這意味着它總是會返回最左邊的匹配項並在找到匹配項后停止匹配。 為了演示,請考慮以下示例:

string input = "Hello World";
string pattern = "Hello|Hello World";
Console.WriteLine(Regex.Match(input, pattern).Value);
pattern = "Hello World|Hello";
Console.WriteLine(Regex.Match(input, pattern).Value);

在您的情況下,首先匹配 group1 ,因此所有其他組將不匹配並返回false 此外,您聲稱“BXYZ”返回 group2,但這是不對的。 "AXYZ" 和 "BXYZ" 都與 group1: (?'group1'A|B)匹配。 如果您需要測試每個組,則需要使用單獨的正則表達式。

暫無
暫無

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

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