括号之间用逗号分组字符串

时间:2010-04-16 08:50:18

标签: c# regex

回复:Regular Expression to find a string included between two characters while EXCLUDING the delimiters

嗨,我正在寻找适用于我的字符串的正则表达式模式,包括括号:

[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7]
可以是任何东西,包括单词,数字,非单词在一起或分开。

我希望通过 \[(.*?)\] 将括号添加到括号中 但是什么是正则表达式模式,它会在括号和子组字符串之间用逗号分隔,以便结果可以跟随?

Group1 : 1,2,3,4,5
 Group1: 1
 Group2: 2
 Group3: 3
 Group4: 4
 Group5: 5

Group2 : abc,ef,g
 Group1: abc
 Group2: ef
 Group3: g

etc ..

感谢您的帮助

5 个答案:

答案 0 :(得分:6)

我同意@Dav,你最好在每个方括号组上使用String.Split。

但是,您可以使用单个正则表达式提取所有数据:

(?:\s*\[((.*?)(?:,(.+?))*)\])+

使用此表达式,您必须处理每个captures的所有group以获取所有数据。例如,在字符串上运行以下代码:

var regex = new Regex(@"(?:\s*\[((.*?)(?:,(.+?))*)\])+");
var match = regex.Match(@"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7]");

for (var i = 1; i < match.Groups.Count; i++)
{
    var group = match.Groups[i];
    Console.WriteLine("Group " + i);

    for (var j = 0; j < group.Captures.Count; j++)
    {
        var capture = group.Captures[j];

        Console.WriteLine("  Capture " + j + ": " + capture.Value 
                                       + " at " + capture.Index);
    }
}

这会产生以下输出:

Group 1
  Capture 0: 1,2,3,4,5 at 1
  Capture 1: abc,ef,g at 13
  Capture 2: 0,2,4b,y7 at 24
Group 2
  Capture 0: 1 at 1
  Capture 1: abc at 13
  Capture 2: 0 at 24
Group 3
  Capture 0: 2 at 3
  Capture 1: 3 at 5
  Capture 2: 4 at 7
  Capture 3: 5 at 9
  Capture 4: ef at 17
  Capture 5: g at 20
  Capture 6: 2 at 26
  Capture 7: 4b at 28
  Capture 8: y7 at 31

第1组为您提供每个方括号组的值,第2组为您提供每个方括号内组匹配的第一个项目,第3组为您提供所有后续项目。您必须查看捕获的索引,以确定哪个项目属于每个方括号内的组。

答案 1 :(得分:3)

这是使用CaptureCollections的另一个选项(在单个正则表达式中执行此操作的唯一方法)。菲尔罗斯的答案在一场比赛中完成了所有这一切,这个比赛做了多场比赛。这样,所有单项捕获都根据找到它们的括号对进行了正确分组。

string s = @"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7] ";
Regex r = new Regex(@"\[((?:([^,\[\]]+),?)*)\]");
int matchNum = 0;
foreach (Match m in r.Matches(s))
{
  Console.WriteLine("Match {0}, Group 1: {1}", ++matchNum, m.Groups[1]);
  int captureNum = 0;
  foreach (Capture c in m.Groups[2].Captures)
  {
    Console.WriteLine("  Group 2, Capture {0}: {1}", ++captureNum, c);
  }
}

输出:

Match 1, Group 1: 1,2,3,4,5
  Group 2, Capture 1: 1
  Group 2, Capture 2: 2
  Group 2, Capture 3: 3
  Group 2, Capture 4: 4
  Group 2, Capture 5: 5
Match 2, Group 1: abc,ef,g
  Group 2, Capture 1: abc
  Group 2, Capture 2: ef
  Group 2, Capture 3: g
Match 3, Group 1: 0,2,4b,y7
  Group 2, Capture 1: 0
  Group 2, Capture 2: 2
  Group 2, Capture 3: 4b
  Group 2, Capture 4: y7

答案 2 :(得分:2)

如果您拥有括号分隔的群组,最好在群组中使用String.Split分割它们。

答案 3 :(得分:1)

\[(.*?)\]会告诉您括号之间的内容,但是如果添加:

\[(?<NumSequence>.*?)\]

这将指定一个您可以参考的组。

修改 然后我会使用Phil的Reg Ex,因为我的上面显示了如何分配一个组。

答案 4 :(得分:0)

我不认为你所要求的可以在一个正则表达式中做。您的数据似乎在括号之间有可变数量的逗号分隔条目,并且没有具有可变数量的捕获组的正则表达式。