В PHP я могу использовать цикл foreach, таким образом, что у меня есть доступ к обоим ключ и значение, например:
foreach($array as $key => $value)
У меня есть следующий код:
Regex regex = new Regex(pattern);
MatchCollection mc = regex.Matches(haystack);
for (int i = 0; i < mc.Count; i++)
{
GroupCollection gc = mc[i].Groups;
Dictionary<string, string> match = new Dictionary<string, string>();
for (int j = 0; j < gc.Count; j++)
{
//here
}
this.matches.Add(i, match);
}
в //here
Я хотел бы match.add(key, value)
но я не могу выяснить, как получить ключ от GroupCollection, который в этом случае должен быть названием группы фиксации. Я знаю это gc["goupName"].Value
содержит значение соответствия.
В .NET имена групп доступны для экземпляра Regex
:
// outside all of the loops
string[] groupNames = regex.GetGroupNames();
Затем вы можете выполнить итерацию на основе этого:
Dictionary<string, string> match = new Dictionary<string, string>();
foreach(string groupName in groupNames) {
match.Add(groupName, gc[groupName].Value);
}
Или, если вы хотите использовать LINQ:
var match = groupNames.ToDictionary(
groupName => groupName, groupName => gc[groupName].Value);
Вы не можете получить доступ к имени группы напрямую, необходимо использовать GroupNameFromNumber
в экземпляре регулярного выражения ( см. Документ ).
Regex regex = new Regex(pattern);
MatchCollection mc = regex.Matches(haystack);
for (int i = 0; i < mc.Count; i++)
{
GroupCollection gc = mc[i].Groups;
Dictionary<string, string> match = new Dictionary<string, string>();
for (int j = 0; j < gc.Count; j++)
{
match.Add(regex.GroupNameFromNumber(j), gc[j].Value);
}
this.matches.Add(i, match);
}
В C # 3 вы также можете использовать LINQ для выполнения такого рода обработки коллекции. Классы для работы с регулярными выражениями реализуют только неуниверсальный IEnumerable
, поэтому вам нужно указать пару типов, но это все равно довольно элегантно.
Следующий код дает вам коллекцию словарей, которые содержат имя группы в качестве ключа и соответствующее значение в качестве значения. Он использует предложение Марка использовать ToDictionary
, за исключением того, что в нем указывается имя группы в качестве ключа (я думаю , что код Марка использует согласованное значение в качестве ключа и имя группы в качестве значения).
Regex regex = new Regex(pattern);
var q =
from Match mci in regex.Matches(haystack)
select regex.GetGroupNames().ToDictionary(
name => name, name => mci.Groups[name].Value);
Затем вы можете просто присвоить результат своему this.matches
.