Цикл через регулярные выражения - PullRequest
27 голосов
/ 24 апреля 2011

Это моя исходная строка:

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

Это мой Регекс Патерн:

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

Это мой класс предметов

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

Это моя коллекция предметов;

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

Я хочу заполнить этот список Item, основываясь на исходной строке. Это моя функция. Это не работает.

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

В этом примере могут быть небольшие ошибки, такие как пропущенная буква в этом примере, потому что это более простая версия того, что у меня есть в приложении.

Проблема в том, что в итоге у меня есть только один элемент в списке заказов.

UPDATE

Я получил это работает. Спасибо за помощь.

Ответы [ 3 ]

41 голосов
/ 11 мая 2011
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();
    }
}

Возвращает 3 матча для меня.Ваша проблема должна быть в другом месте.

11 голосов
/ 13 декабря 2011

Для дальнейшего использования я хочу документировать приведенный выше код, преобразованный с использованием декларативного подхода, как фрагмент кода 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();

С выходом:

List of matches

5 голосов
/ 15 января 2014

Чтобы обратиться только к названию вопроса («цикл по матчам с регулярными выражениями»), вы можете:

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

Это сведет все захваченные значения в один список.Для ведения групп захвата используйте Select вместо SelectMany, чтобы получить список списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...