Как UrlEncode значение соответствия группы с помощью Regex.Replace в С#

Я использую регулярное выражение в своем коде С#, которое соответствует некоторым URL-адресам контента, используя Regex.Replace. Я думаю, что у меня есть шаблон, который мне нужен, чтобы он соответствовал правильно. Я использую синтаксис значения группы «$ 1» для создания новой строки. Проблема в том, что мне нужно UrlEncode значение, предоставленное «$ 1». Нужно ли мне перебирать коллекцию совпадений или я все еще могу использовать Regex.Replace? Спасибо за вашу помощь.

Regex regex = new Regex(@"src=""(.+?/servlet/image.+?)""");

// value of $1 needs to be Url Encoded!
string replacement = @"src=""/relative/image.ashx?imageUrl=$1""";
string text1 = @"src=""http://www.domain1.com/servlet/image?id=abc""";
string text2 = @"src=""http://www2.domain2.com/servlet/image?id2=123""";
text1 = regex.Replace(text1, replacement);
/*
    text1 output:
    src="/relative/image.ashx?imageUrl=http://www.domain1.com/servlet/image?id=abc"
    imageUrl param above needs to be url encoded
*/

text2 = regex.Replace(text2, replacement);
/*
    text2 output:
    src="/relative/image.ashx?imageUrl=http://www2.domain2.com/servlet/image?id2=123"
    imageUrl param above needs to be url encoded
*/

person fehays    schedule 18.02.2011    source источник
comment
хммм, почему у меня странное чувство, что вы используете регулярное выражение не только для синтаксического анализа URL-адресов, таких как синтаксический анализ HTML. Первое плохо, второе, ну, я думаю, у @bobince есть правильные слова, чтобы объяснить это stackoverflow.com/questions/1732348/:   -  person Darin Dimitrov    schedule 18.02.2011
comment
Спасибо за это. Это было забавно :). Да, я разбираю html, но он больше относится к категории ответа непосредственно под тем, на который вы ссылаетесь. Я достаточно знаю, чтобы понять, что это дерьмовый способ сделать это, но я кое-что интегрирую, и у меня не так много выбора.   -  person fehays    schedule 18.02.2011


Ответы (1)


Regex.Replace() имеет перегрузку, которая принимает делегат MatchEvaluator. Этот делегат принимает объект Match и возвращает строку замены. Что-то вроде этого должно работать для того, что вы хотите.

regex.Replace(text, delegate(Match match)
{
    return string.Format(@"src=""/relative/image.ashx?imageUrl={0}""", HttpUtility.UrlEncode(match.Groups[1].Value));
});
person Brian Reichle    schedule 20.02.2011