用正则表达式重写URL

时间:2010-08-10 15:01:25

标签: c# regex

我希望使用C#中的正则表达式替换来转换查询字符串。

我有许多已定义的查询字符串参数(即A,B和C)。

我希望改变这样的事情

page.aspx?A=XXX&B=YYY&C=1

成:

page/XXX/YYYY/true

请注意,A和B的前两个参数值只是连接在一起,但我遇到问题的部分是将输出中的C=1更改为true

甚至可以这样做吗?如果找不到C=1部分,我不想输出任何内容:

page.aspx?A=XXX&B=YYY

变为:

page/XXX/YYY

我不认为源查询字符串中A和B的顺序是不同的顺序,但是如果B出现在A之前,可以编写一些内容来应对吗?

我一直在尝试各种各样的事情。至关重要的是,我很想知道是否可以这样做,因为如果没有,我将不得不采取另一种方式。

2 个答案:

答案 0 :(得分:1)

最好不要使用正则表达式 试试这个:


            string urlString = "page.aspx?A=XXX&B=YYY&C=1";
            var builder = new System.UriBuilder(urlString);
            // the first character in Query will be a "?"
            string[] queries = builder.Query.Substring(1).Split('&');

此时,您将每个查询项分隔为自己的字符串。您可以在数组的每个元素上使用内置字符串方法(如queryies [0] .StartsWith())来标识哪个字符串是“C”查询字符串,并根据需要构建路径。

答案 1 :(得分:0)

正如罗伯特H在评论中提到的,你可能会比使用正则表达式获得更好的里程数(String.Replace())。但是,我会用正则表达式(如果你真的需要它)将它们分成三个不同的语句,这样你就可以了 Regex.Replace(yourString, [patern for A=], "page/");
Regex.Replace(yourString, [patern for B=], "/");
Regex.Replace(yourString, [patern for C=], "true");

如果您想清楚自己正在做什么,请先为每个模式调用Regex.Match(),以验证输入中是否存在模式。然后,如果它丢失了,你可以跳过替换。

因此,这应该对您有用:注意:没有完成错误检查,自行使用“按原样”

string input = "A=xxx&B=yyy&C=1";
string input2 = "A=xxx&B=yyy";

if(Regex.Match(input, "A=").Success) input = Regex.Replace(input, "A=", "page/");
if(Regex.Match(input,@"\&B=").Success) input = Regex.Replace(input, @"\&B=", "/");
if(Regex.Match(input,@"\&C=1").Success) input = Regex.Replace(input, @"\&C=1", "/true");

if(Regex.Match(input2, "A=").Success) input2 = Regex.Replace(input2, "A=", "page/");
if(Regex.Match(input2,@"\&B=").Success) input2 = Regex.Replace(input2, @"\&B=", "/");
if(Regex.Match(input2,@"\&C=1").Success) input2 = Regex.Replace(input2, @"\&C=1", "/true");

Console.WriteLine(input); //Output = page/xxx/yyy/true
Console.WriteLine(input2); //Output = page/xxx/yyy