如何将Regex.Matches放入数组中?
我有多个正则表达式匹配。 如何将它们放入一个数组中并单独调用它们,例如ID[0] ID[1]
?
string value = ("{\"ID\":\"([A-Za-z0-9_., ]+)\","); string ID = Regex.Matches(textt, @value);`
你可以这样做,因为MatchCollection
有一个int索引器 ,允许你通过索引访问匹配。 这完全有效:
MatchCollection matches = Regex.Matches(textt, @value); Match firstMatch = matches[0];
但是如果你真的想把匹配放到一个数组中,你可以这样做:
Match[] matches = Regex.Matches(textt, @value) .Cast() .ToArray();
另一种方法
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个的组合可能更容易接受…… 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()); }
除了返回非强类型MatchCollection
的问题之外, .NET中的Regex.Matches()
方法还有一个问题。 也就是说,虽然有一个重载允许您在输入字符串中指定起始索引,但是无法限制字符数。
以下扩展方法解决了这两个问题。 它也比Matches()
和MatchCollection
的.NET配对简单得多,因为它消除了由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 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; }