2010-02-28 3 views
11

В PHP можно использовать цикл Еогеаспа таким образом, что у меня есть доступ как к ключу и значению, например:С контуром # Еогеаспа с ключевым значением

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 содержит значение совпадения.

+0

Какой ключ, который является значением? – kennytm

ответ

10

В .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); 
3

Вы не можете получить доступ к имени группы напрямую, вам нужно использовать GroupNameFromNumber экземпляра регулярного выражения (see doc).

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

В C# 3 вы также можете использовать LINQ для выполнения такой обработки коллекции. Классы для работы с регулярными выражениями реализуют только не общие IEnumerable, поэтому вам нужно указать несколько типов, но это все еще довольно элегантно.

Следующий код дает вам набор словарей, которые содержат имя группы в качестве ключа и согласованное значение в качестве значения. Он использует предложение Марка использовать ToDictionary, за исключением того, что он определяет имя группы в качестве ключа (I считает, что код Марка использует совпадающее значение в качестве имени ключа и группы в качестве значения).

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.

+0

@ Томас - исправлено это; хороший место. –

Смежные вопросы