Регулярные выражения .NET - более короткое совпадение - PullRequest
1 голос
/ 28 мая 2010

У меня есть вопрос, касающийся регулярных выражений .NET и того, как он определяет совпадения. Я пишу:

var regex = new Regex("<tr><td>1</td><td>(.+)</td><td>(.+)</td>");
if (regex.IsMatch(str))
{
    var groups = regex.Match(str).Groups;
    var matches = new List<string>();
    for (int i = 1; i < groups.Count; i++)
        matches.Add(groups[i].Value);

    return matches;
}

Я хочу получить содержимое двух следующих тегов. Вместо этого он возвращает:

[0]: Cell 1</td><td>Cell 2</td>...
[1]: Last row of the table

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

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

Ваше регулярное выражение включает

(.+)

, что является жадным совпадением. Жадные совпадения простираются как далеко , насколько они могут, прежде чем соответствовать следующему символу (< в вашем случае). Попробуйте:

(.+?)

Это не жадное совпадение , которое расширяется как немного , насколько это возможно, до сопоставления со следующим символом.

1 голос
/ 28 мая 2010

Вам нужно указать ленивое соответствие.Вместо + используйте +?, чтобы сказать, что должно совпадать как можно меньше символов.

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