2010-02-28 35 views
11

En PHP puedo utilizar un bucle foreach tal que tengo acceso tanto a la clave y el valor por ejemplo:C bucle # foreach con valor de clave

foreach($array as $key => $value) 

I tienen el siguiente código:

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

en //here Me gustaría match.add(key, value) pero no entiendo cómo obtener la clave de GroupCollection, que en este caso debería ser el nombre del grupo de captura. Sé que gc["goupName"].Value contiene el valor de la coincidencia.

+0

¿Cuál es la clave, cuál es el valor? – kennytm

Respuesta

10

En .NET, los nombres de los grupos están disponibles en contra de la Regex ejemplo:

// outside all of the loops 
string[] groupNames = regex.GetGroupNames(); 

A continuación, puede iterar sobre la base de esto:

Dictionary<string, string> match = new Dictionary<string, string>(); 
foreach(string groupName in groupNames) { 
    match.Add(groupName, gc[groupName].Value); 
} 

O si desea utilizar LINQ :

var match = groupNames.ToDictionary(
      groupName => groupName, groupName => gc[groupName].Value); 
3

No puede acceder al nombre del grupo directamente, tiene que usar GroupNameFromNumber en la instancia de expresiones regulares (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

En C# 3, también puede usar LINQ para realizar este tipo de procesamiento de recopilación. Las clases para trabajar con expresiones regulares implementan solo el IEnumerable no genérico, por lo que debe especificar un par de tipos, pero sigue siendo bastante elegante.

El siguiente código proporciona una colección de diccionarios que contienen el nombre del grupo como clave y el valor coincidente como valor. Utiliza la sugerencia de Marc para usar ToDictionary, excepto que especifica el nombre del grupo como la clave (I piensa que el código de Marc usa el valor coincidente como la clave y el nombre del grupo como el valor).

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

entonces se podría simplemente asignar el resultado a su this.matches.

+0

@Tomas - solucionó eso; buen lugar. –

Cuestiones relacionadas