Regex.Replace заменяет только начало строки - PullRequest
1 голос
/ 14 апреля 2010

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

string text = "[Hotel Des Terrasses \http://flash-hotel.fr/] and [Du Phare \http://www.activehotels.com/hotel/]";
text = Regex.Replace(text, @"\[(.+)\s*\\(.+)\]", "<a href=\"$2\" target=\"_blank\">$1</a>");

Как мне сделать так, чтобы второй шаблон также был заменен разметкой HTML?

Ответы [ 3 ]

4 голосов
/ 14 апреля 2010

Ваше регулярное выражение обрабатывает всю строку как одно совпадение. Попробуйте использовать (.+?) вместо (.+) (оба экземпляра).

2 голосов
/ 14 апреля 2010

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

        StringBuilder sb = new StringBuilder();
        int pos = 0;

        Regex exp = new Regex(@"\[(.+?)\s*\\(.+?)\]");
        foreach (Match m in exp.Matches(text))
        {
            sb.Append(text, pos, m.Index - pos);
            pos = m.Index + m.Length;

            Uri tmp;
            if(Uri .TryCreate(m.Groups[2], UriKind.Absolute, out tmp))
            {
                sb.AppendFormat("<a href=\"{0}\" target=\"_blank\">{1}</a>",
                    System.Web.HttpUtility.HtmlAttributeEncode(tmp.AbsoluteUri),
                    System.Web.HttpUtility.HtmlEncode(m.Groups[1])
                    );
            }
        }
        sb.Append(text, pos, text.Length - pos);

Примечание: Не уверен в индексах групп, я бы использовал именованные группы в reg-ex. Вы пробовали использовать инструмент регулярных выражений, например Expresso ?

1 голос
/ 14 апреля 2010

Регулярное выражение принимает самое длинное совпадение , которое в данном случае является всей строкой, потому что ваши условия состоят в том, что оно начинается с [, заканчивается ] и имеет по крайней мере один обратная косая черта где-то посередине. Повторно укажите регулярное выражение, чтобы не допустить еще ] в скобках, например, используйте [^\]] вместо . (в обоих случаях).

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