[英]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_n1
和string_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
無需更改您的正則表達式。 您只需要更改從捕獲組中檢索結果的方式。
既然你下的多個同名捕獲組,以便檢索該名稱下完成的全攻略,你需要遍歷所有Capture
的Groups["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);
}
}
}
據我所知,這是.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.