簡體   English   中英

NET正則表達式中如何有兩個具有相同名稱的命名組?

[英]How to have two named groups with same name in .net regex?

我正在使用正則表達式來標識一些命名組。 在少數情況下,有多個具有不同模式的組。 問題是將所有命名組放入相應的列表中。 約束是我不能有多個正則表達式,並且我不能多次調用執行該正則表達式。 我試過下面的代碼,但它總是返回第二種模式:

        Regex reg = new Regex(@"(?<n1>pattern_n1_1) (?<n2>pattern_n2_1) (?<n1>pattern_n1_2) (?<n2>pattern_n1_2)", RegexOptions.IgnoreCase);

        String str = "pattern_n1_1 pattern_n2_1 pattern_n1_2 pattern_n1_2";

        List<String> matchedText = new List<string>();
        List<String> string_n1 = new List<string>();
        List<String> string_n2 = new List<string>();

        MatchCollection mc = reg.Matches(str);
        if (mc != null)
        {
            foreach (Match m in mc)
            {
                matchedText.Add(m.Value.Trim());
                string_n1.Add(m.Groups["n1"].Value);
                string_n2.Add(m.Groups["n2"].Value);
            }
        }

在這里,列表string_n1string_n2每個都有一個元素。 string_n1具有“ pattern_n1_2”, string_n2具有“ pattern_n2_2”。 但是,我要求“ pattern_n1_1”和“ pattern_n1_2”都在string_n1 ,並且“ pattern_n2_1”和“ pattern_n2_2”都在string_n2

無需更改您的正則表達式。 您只需要更改從捕獲組中檢索結果的方式。

既然你下的多個同名捕獲組,以便檢索該名稱下完成的全攻略,你需要遍歷所有CaptureGroups["n1"].Captures ,而不是訪問與單個捕獲Groups["n1"].Value

MatchCollection mc = reg.Matches(str);
if (mc != null)
{
    foreach (Match m in mc)
    {
        matchedText.Add(m.Value.Trim());

        foreach (Capture c in m.Groups["n1"].Captures) {
            string_n1.Add(c.Value);
        }

        foreach (Capture c in m.Groups["n2"].Captures) {
            string_n2.Add(c.Value);
        }
    }
}

ideone上的演示

據我所知,這是.NET Regex API獨有的功能。 沒有其他任何一種可提供API來遍歷重復捕獲組的所有匹配項:

^\w+(?: (\w+))+$

在上面的示例中,其他風味僅返回捕獲組1的最后捕獲。 .NET允許您按捕獲組提取所有捕獲。

而且,盡管有多種樣式允許您為不同的捕獲組定義相同的名稱,但其他樣式僅允許您在通過組名進行查詢時訪問其中一個捕獲。

參考

根據具體情況,以下內容可能會滿足您的需求,但不是通用解決方案:

Regex reg = new Regex(@"((?<n1>(pattern_n1_1|pattern_n1_2)) (?<n2>(pattern_n2_1|pattern_n1_2)) ){2}", RegexOptions.IgnoreCase);

這將捕獲比原始版本更多的內容,例如,pattern_n1_2將被捕獲為該版本中的第四個“組”,而不是原始版本。

暫無
暫無

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

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