2011-04-23 10 views
18

Ésta es mi cadena de origen:Retransmisión de expresión coincide con

<box><3> 
<table><1> 
<chair><8> 

Esta es mi expresión regular Patern:

<(?<item>\w+?)><(?<count>\d+?)> 

Ésta es mi clase de artículos

class Item 
{ 
    string Name; 
    int count; 
    //(...) 
} 

Esta es mi colección de artículos ;

List<Item> OrderList = new List(Item); 

Quiero llenar esa lista con elementos según la cadena de origen. Esta es mi función. No funciona.

Regex ItemRegex = new Regex(@"<(?<item>\w+?)><(?<count>\d+?)>", RegexOptions.Compiled); 
      foreach (Match ItemMatch in ItemRegex.Matches(sourceString)) 
      { 
       Item temp = new Item(ItemMatch.Groups["item"].ToString(), int.Parse(ItemMatch.Groups["count"].ToString())); 
       OrderList.Add(temp); 
      } 

threre puede haber algunos pequeños errores como letra que falta que este ejemplo porque se trata versión más fácil de lo que tengo en mi aplicación.

El problema es que al final solo tengo un artículo en la lista de pedidos.

ACTUALIZACIÓN

Lo tengo trabajo. Thans por ayuda.

+2

Simplemente ejecútelo: funciona como se esperaba (3 artículos en la lista). – ChrisWue

+0

Encontré mi error. – Hooch

+2

¿Puedes compartirlo? Podría ayudar a alguien si se encuentra con el mismo problema. – ChrisWue

Respuesta

33
class Program 
{ 
    static void Main(string[] args) 
    { 
     string sourceString = @"<box><3> 
<table><1> 
<chair><8>"; 
     Regex ItemRegex = new Regex(@"<(?<item>\w+?)><(?<count>\d+?)>", RegexOptions.Compiled); 
     foreach (Match ItemMatch in ItemRegex.Matches(sourceString)) 
     { 
      Console.WriteLine(ItemMatch); 
     } 

     Console.ReadLine(); 
    } 
} 

Devuelve 3 coincidencias para mí. Tu problema debe estar en otro lugar.

8

Para referencia futura Quiero documentar el código anterior se convirtieron al uso de un enfoque declarativo como un fragmento de código LINQPad:

var sourceString = @"<box><3> 
<table><1> 
<chair><8>"; 
var count = 0; 
var ItemRegex = new Regex(@"<(?<item>[^>]+)><(?<count>[^>]*)>", RegexOptions.Compiled); 
var OrderList = ItemRegex.Matches(sourceString) 
        .Cast<Match>() 
        .Select(m => new 
        { 
         Name = m.Groups["item"].ToString(), 
         Count = int.TryParse(m.Groups["count"].ToString(), out count) ? count : 0, 
        }) 
        .ToList(); 
OrderList.Dump(); 

Con salida:

List of matches

+0

¿Qué programa está en esa captura de pantalla? ¿Es tu propio programa? – Hooch

+1

Eso es generado por el método de extensión Dump() de LinqPad. Puede pegar Dump() en el extremo de la mayoría de los objetos y generará una representación formateada del objeto. LinqPad es solo una herramienta excepcional para escribir/evaluar el código de C# http://www.linqpad.net/. El código anterior se puede copiar y pegar directamente en LinqPad y generará la tabla. –

+1

Entonces, soy como, lawl ... Voy a hacer clic en "editar" para ver el descuento para hacer una tabla tan bonita. – Suamere

5

Para hacer frente a sólo el título de la pregunta ("bucle a través de coincidencias Regex"), puede:

var lookfor = @"something (with) multiple (pattern) (groups)"; 
var found = Regex.Matches(source, lookfor, regexoptions); 
var captured = found 
       // linq-ify into list 
       .Cast<Match>() 
       // flatten to single list 
       .SelectMany(o => 
        // linq-ify 
        o.Groups.Cast<Capture>() 
         // don't need the pattern 
         .Skip(1) 
         // select what you wanted 
         .Select(c => c.Value)); 

Esto "aplanará" todos los valores capturados en una sola lista. Para mantener los grupos de captura, use Select en lugar de SelectMany para obtener una lista de listas.

Cuestiones relacionadas