Regex: сопоставление ссылок в стиле уценки

Я хочу проанализировать ссылки в стиле уценки, но у меня возникают проблемы с сопоставлением ссылок в стиле ссылок. Как этот: [id]: http://example.com/ "Optional Title Here"

Мое регулярное выражение получает идентификатор и URL-адрес, но не заголовок.

Вот что у меня есть:

/\[([a-zA-Z0-9_-]+)\]: (\S+)\s?("".*?"")?/

Я просматриваю и добавляю ссылки в хеш-таблицу. идентификатор в качестве ключа, а значение — это экземпляр класса, который я создал под названием LinkReference, который содержит только URL-адрес и заголовок. Если проблема не в моем регулярном выражении, а в моем коде, добавляющем совпадения в хеш-таблицу, вот мой код и для этого:

        Regex rx = new Regex(@"\[([a-zA-Z0-9_-]+)\]: (\S+)\s?("".*?"")?");
        MatchCollection matches = rx.Matches(InputText);
        foreach (Match match in matches)
        {
            GroupCollection groups = match.Groups;
            string title = null;
            try
            {
                title = groups[3].Value;
            }
            catch (Exception)
            {
                // keep title null
            }
            LinkReferences.Add(groups[1].Value, new LinkReference(groups[2].Value, title));
        }

person The.Anti.9    schedule 24.05.2010    source источник


Ответы (1)


Я думаю, что у вас на самом деле есть два пробела между URL-адресом и заголовком (он не отображается в отображаемом HTML-коде Stack Overflow, но я вижу его в исходном коде страницы...)

В любом случае, я считаю, что вы хотите изменить \s? (0 или 1 пробел) на \s* (0 или более пробелов):

var rx = new Regex(@"\[([a-zA-Z0-9_-]+)\]: (\S+)\s*("".*?"")?");

Вероятно, вы также захотите разрешить несколько пробелов по обе стороны от «:» и в нескольких других местах, например:

var rx = new Regex(@"\[\s*([a-zA-Z0-9_-]+)\s*\]\s*:\s*(\S+)\s*("".*?"")?");

(не помешает быть либеральным в разрешении пробелов, ИМО)

person Dean Harding    schedule 24.05.2010
comment
Ах ха! Да, это оно. Спасибо :) - person The.Anti.9; 24.05.2010