如何将Regex.Matches放入数组中?

时间:2011-01-08 04:59:41

标签: c# arrays regex

我有多个正则表达式匹配。如何将它们放入数组中并单独调用它们,例如ID[0] ID[1]

string value = ("{\"ID\":\"([A-Za-z0-9_., ]+)\",");
string ID = Regex.Matches(textt, @value);`

4 个答案:

答案 0 :(得分:27)

您可以这样做,因为MatchCollection有一个int indexer,可让您按索引访问匹配项。这完全有效:

MatchCollection matches = Regex.Matches(textt, @value);
Match firstMatch = matches[0];

但是如果你真的想把匹配放到一个数组中,你可以这样做:

Match[] matches = Regex.Matches(textt, @value)
                       .Cast<Match>()
                       .ToArray();

答案 1 :(得分:1)

另一种方法

  string value = ("{\"ID\":\"([A-Za-z0-9_., ]+)\",");
  MatchCollection match = Regex.Matches(textt, @value);

  string[] ID = new string[match.Count];
  for (int i = 0; i < match.Length; i++)
  {
    ID[i] = match[i].Groups[1].Value; // (Index 1 is the first group)
  }

答案 2 :(得分:1)

或者这个最后2个的组合可能更容易接受...... MatchCollection可以像数组一样直接使用 - 不需要辅助数组:

string value = ("{\"ID\":\"([A-Za-z0-9_., ]+)\",");
MatchCollection matches = Regex.Matches(textt, @value);
for (int i = 0; i < matches.Count; i++)
{
    Response.Write(matches[i].ToString());
}

答案 3 :(得分:0)

除了返回非强类型MatchCollection的问题外, .NET 中的Regex.Matches()方法还存在其他问题。即,尽管有一个重载可以让您在输入字符串中指定一个起始索引,但是却无法限制字符数。

以下扩展方法可以解决这两个问题。它比Matches()MatchCollection .NET 配对要简单得多,因为它消除了受MatchCollection影响的惰性评估行为,而返回了完整的全部一次匹配。

public static Match[] Matches(this Regex rx, String s, int ix, int c)
{
    if ((ix | c) < 0 || ix + c > s.Length)
        throw new ArgumentException();

    int i = 0;
    var rg = Array.Empty<Match>();
    Match m;
    while (c > 0 && (m = rx.Match(s, ix, c)).Success)
    {
        if (i == rg.Length)
            Array.Resize(ref rg, (i | 1) << 1);

        rg[i++] = m;
        c += ix - (ix = m.Index + m.Length);
    }
    if (i < rg.Length)
        Array.Resize(ref rg, i);
    return rg;
}