2009-09-14 5 views
3

В C# я пытаюсь использовать регулярные выражения для замены значений в строке запроса. Так что, если у меня есть:Заменить значение QueryString с помощью регулярных выражений

http://www.url.com/page.aspx?id=1

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

string url = "http://www.url.com/page.aspx?id=1"; 
string newURL = ReplaceQueryStringValue(url, "id", "2"); 

private string ReplaceQueryStringValue(string url, string replaceWhat, string replaceWith) 
{ 
    return Regex.Replace(url, "[^?]+(?:\?"+replaceWhat+"=([^&]+).*)?",replaceWith); 
} 
+0

так в чем вопрос? – annakata

ответ

9

Вот функция, которая будет делать работу:

static string replace(string url, string key, string value) 
{ 
    return Regex.Replace(
     url, 
     @"([?&]" + key + ")=[^?&]+", 
     "$1=" + value); 
} 
+0

@Andrew: Похоже, вы заменяете ключи, а не значения. Пожалуйста, настройте. –

+1

@ Давид: ты уверен? Мне кажется. Скобки вокруг возможного? или & и ключ в регулярном выражении позволяет Эндрю включать исходный ключ в заменяющую строку, используя обратную ссылку $ 1. Старое значение отбрасывается только включением нового значения в строку замены. – brism

+0

@brism - Спасибо, это именно то, что происходит. @GordonG - Мне интересно об изменении, знаете ли вы, что 'string' и' String' являются синонимом C#? –

2

Это может быть проще в использовании String.split сначала вырезать URL в страницы и строки запроса частей, а затем использовать Split.String снова, чтобы вырезать строку запроса на отдельные части.

var urlSplit = url.Split('?'); 
var originalURL = urlSplit[0]; 

var urlRedefined = url; 
if(urlSplit.Length == 2) 
{ 
    var queryString = urlSplit[1].Split('&'); 

    //your code here 

    var urlRedefined = String.Format("{0}?{1}", 
    originalURL, 
    String.Join("&", queryString); 
} 

Регулярное выражение может быть излишним для ваших нужд. Кроме того, класс System.Uri может быть лучше подходит. Его использование распространяется на URL split in C#?.

+0

Возможно, я мог бы использовать String.Split. Почему regex будет излишним? –

+0

@unknown: Я имею в виду чрезмерное употребление в шаблонах регулярных выражений, которые, как известно, являются болезненными, чтобы получить право. Вы можете увидеть успех в ограниченном тестировании, но потом небольшая вещь может выбросить ваш код. Мой ответ не дает вам простого способа получить имя запроса (например, «Id») и заменить его значение, поэтому, возможно, другой подход будет более успешным. –

+0

@unknown: По-видимому, я был ошибочен Эндрю Харе. –

Смежные вопросы