我希望使用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之前,可以编写一些内容来应对吗?
我一直在尝试各种各样的事情。至关重要的是,我很想知道是否可以这样做,因为如果没有,我将不得不采取另一种方式。
答案 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