Regex: Почему нет группы для каждого найденного предмета? - PullRequest
1 голос
/ 29 января 2009

У меня есть следующий текст:

<i><b>It is noticeably faster.</b></i> <i><b>They take less disk space.</i>

И следующее регулярное выражение:

(</[b|i|u]>)+(\s*)(<[b|i|u]>)+

Соответствие создает следующие группы:

0: </b></i>   <b><i>
1: </i>
2: spaces
3: <b>

Как я могу изменить свое регулярное выражение, чтобы оно создавало такие группы:

0: </b></i>   <b><i>
1: </b>
2: </i>
3: spaces
4: <i>
3: <b>

Ответы [ 4 ]

4 голосов
/ 29 января 2009

Я подозреваю, что вы уже получили то, что вам нужно - вам просто нужно перечислить снимки для каждой группы. Вот пример программы, показывающей это в действии:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text = 
"<i><b>It is noticeably faster.</b></i> <i><b>They take less disk space.</i>";
        Regex pattern = new Regex(@"(</[b|i|u]>)+(\s*)(<[b|i|u]>)+");

        Match match = pattern.Match(text);
        foreach (Group group in match.Groups)
        {
            Console.WriteLine("Next group:");
            foreach (Capture capture in group.Captures)
            {
                Console.WriteLine("  " + capture.Value);
            }
        }
    }
}
1 голос
/ 29 января 2009

Вы не можете. Группа может содержать только одну вещь, даже если она встречает более одной вещи в одном матче из-за +, * или подобного. Конечно, вы можете использовать регулярные выражения или аналогичные в этой группе, чтобы получить отдельные элементы.

Таким образом, в каждом матче будет по одной вещи на группу.

0 голосов
/ 29 января 2009

Я нашел эту веб-страницу http://regexlib.com/RETester.aspx полезной для тестирования выражений RegEx. Его можно оценить с помощью механизма .Net или механизмов на стороне клиента для VBScript или JavaScript.

Мне нравится этот онлайн-инструмент от RegExLib, потому что он доступен на любой машине, на которой я работаю, но приложение Expresso от UltraPico.com, которое Джексон рекомендовал в комментарии к исходному сообщению с вопросом, выглядит хорошо. Лучше, чем просто тестирование, это помогает создать ваш RegEx. Я только что загрузил его и собираюсь попробовать.

Теперь, если бы был только инструмент, который мог бы читать сложные регулярные выражения и дать описание на естественном языке того, что он должен был делать. Особенно, если вы можете указать, что вы анализируете HTML или какой-либо другой тип данных, так что описание будет адаптировано для использования. :)

0 голосов
/ 29 января 2009

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

((?:</[biu]>)+)(\s*)((?:<[biu]>)+)

Это будет соответствовать

0: </b></i> <i><b>
1: </b></i>
2: _
3: <i><b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...