簡體   English   中英

使用OR時C#中的正則表達式集合組

[英]Regex collection groups in C# when using an OR

如果我有以下代碼:

Regex xp = new Regex(@"(\*\*)(.+?)\*\*|(\*)([^\*]+)\*");

string text = @"*hello* **world**";

MatchCollection r_Matches = xp.Matches(text);

foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
    Console.WriteLine(m.Groups[3].ToString());
}

// Outputs:
// ''
// '*'
// '**'
// ''

如何運行上述正則表達式,並使OR兩側的第一個集合的結果出現在同一位置? (即.Groups [1]返回**_ ,我認為這不是C#中的正則表達式如何工作,但是可以實現嗎?如果可以,怎么辦?)

您可以使用反向引用

Regex xp = new Regex(@"(\*{1,2})(.+?)\1");

string text = @"*hello* **world**";

MatchCollection r_Matches = xp.Matches(text);

foreach (Match m in r_Matches)
{
    Console.WriteLine(m.Groups[1].ToString());
}

這將匹配***然后再匹配任意一個或多個字符,直到找到與之前匹配的對象( *** )為止。

正如評論者之一所說,您可以為此使用命名組。 .NET比大多數其他正則表達式風格更靈活,因為它允許您無限制地在正則表達式的不同部分使用相同的名稱。 使用此正則表達式:

@"(?<delim>\*\*)(?<content>.+?)\*\*|(?<delim>\*)(?<content>[^*]+)\*"

...您可以像這樣提取感興趣的部分:

foreach (Match m in r_Matches)
{
    Console.WriteLine("Delimiter: {0}\nContent: {1}",
                      m.Groups["delim"].Value,
                      m.Groups["content"].Value);
}

這就是全部。 與其他評論之一相反,您不必為GroupCollections或CaptureCollections之類的東西而煩惱。

請注意,幾乎可以通過任何方式輕松解決此特定問題。 只是.NET比大多數產品更靈活。

暫無
暫無

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

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