Как написать регулярное выражение, которое ищет динамическое количество пар? - PullRequest
0 голосов
/ 05 марта 2010

Допустим, есть строка вроде этой:

string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";}} asd lore ipsum";

Информация, которую я хочу извлечь "abc" и такие пары, как ("prop1", "asd"), ("prop3", "bcd"), где каждая пара использовала a; в качестве разделителя.

Edit1: (на основе кода MikeB)

Ах, приближаемся. Я узнал, как разобрать следующее:

    string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd";
    Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>([a-z0-9]*=\"[a-z0-9.:/?=]*\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase);
    Match m = r.Match(txt);
    if (m.Success)
    {
        Console.WriteLine(m.Groups["single"].Value);
        foreach (Capture cap in m.Groups["pair"].Captures)
        {
             Console.WriteLine(cap.Value);
        }
    }

Вопрос 1: Как мне настроить регулярное выражение так, чтобы оно говорило «каждое значение пары ограничено только \»? Я добавил символы типа «.», «;» и т. д., но я не могу вспомнить ни одного символа, который я хочу разрешить. С другой стороны, было бы намного лучше.

Вопрос 2 : Как мне отрегулировать работу этого регулярного выражения с этой штукой здесь?

    string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd lore ipsum {{aabc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}}";

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

1 Ответ

2 голосов
/ 05 марта 2010

Я сделал некоторые предположения о том, как вы фильтруете, но я думаю, что идея в значительной степени там. Каждая пара помещается в коллекцию снимков группы, и вы можете иметь любое количество пар.

        string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";prop3=\"bbb\";}} asd lore ipsum";            
        Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>((?<key>([a-z0-9]*))=\"(?<value>([a-z0-9]*))\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase);
        Match m = r.Match(txt);            
        if (m.Success)
        {
            Console.WriteLine(m.Groups["single"].Value);
            foreach (Capture cap in m.Groups["pair"].Captures)
            {
                Console.WriteLine(cap.Value);                    
            }
            foreach (Capture cap in m.Groups["key"].Captures)
            {
                Console.WriteLine(cap.Value);
            }
            foreach (Capture cap in m.Groups["value"].Captures)
            {
                Console.WriteLine(cap.Value);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...