2010-08-10 106 views
0

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

我有一些定义的查询字符串参数(即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

使用普通的c#代码而不是正则表达式会更简单(也更清晰)。 – 2010-08-10 15:03:39

回答

0

正如Robert 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 
+0

这很有趣。正如我在回复JMarsch时所说的,我希望将这些东西放在配置文件中,这似乎是一种可行的做事方式。 别担心 - 我会自己承担风险; – Shane 2010-08-10 16:30:28

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”查询字符串,并根据需要构建您的路径。

+0

非常感谢您的及时回复JMarsch!我原以为这是我要走下去的路线。我只是想知道是否可以创建一个单一的正则表达式来完成这项工作,因为我可以将它放入一个配置文件中,并在C#组件中替换为'generic'。 感谢您的帮助。 – Shane 2010-08-10 16:29:01