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

15

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

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

1
据我所知,Matches() 返回的是一个集合,而不是一个字符串。 - BoltClock
4个回答

34

你已经可以这样做了,因为 MatchCollection 拥有一个 int 索引器,让你可以通过索引来访问匹配项。下面的代码是完全有效的:

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

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

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

你能发布一下你上面第二段代码片段的VB等效版本吗? - Smith
1
@Smith 请尝试:Dim matches() As Match = Regex.Matches(textt, @value).Cast(Of Match)().ToArray() - Crag
我正在使用 .NET 2.0,那个转换在那里不受支持。 - Smith
@ani,为什么我在4.5中没有转换选项? - Eli Ekstein
2
@EliEkstein 你需要导入 using System.Linq :-) - Pascal

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());
}

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)
  }

过于复杂,使用了次级数组。请看我的答案。 - vapcguy

0

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

以下扩展方法解决了这两个问题。它也比.NETMatches()MatchCollection配对要简单得多,因为它取消了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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接