gpt4 book ai didi

c# - 如何在 .net 正则表达式中拥有两个具有相同名称的命名组?

转载 作者:行者123 更新时间:2023-12-02 04:25:19 26 4
gpt4 key购买 nike

我有一个正则表达式来识别一些命名组。有少数情况下有多个具有不同模式的组。问题是将所有命名组放入相应的列表中。限制是我不能有多个正则表达式,并且不能多次调用执行正则表达式。我尝试过以下代码,但它总是返回第二个模式:

        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

最佳答案

无需更改您的正则表达式。您只需更改从捕获组检索结果的方式即可。

由于您有多个同名的捕获组,为了检索以该名称完成的所有捕获,您需要循环遍历 Groups["n1"] 中的所有 Capture。捕获,而不是使用 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);
}
}
}

Demo on ideone

据我所知,这是 .NET Regex API 独有的功能。其他风格都没有提供 API 来遍历重复捕获组的所有匹配项:

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

其他风格仅返回上例中捕获组 1 的最后一次捕获。 .NET 允许您通过捕获组提取所有捕获。

虽然有些风格允许您为不同的捕获组定义相同的名称,但其他风格仅允许您在通过组名称查询时访问其中一个捕获。

引用

关于c# - 如何在 .net 正则表达式中拥有两个具有相同名称的命名组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com