【问题标题】:Replace QueryString value using regular expressions使用正则表达式替换 QueryString 值
【发布时间】:2009-09-14 20:04:15
【问题描述】:

在 C# 中,我尝试使用正则表达式替换查询字符串中的值。所以,如果我有:

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);
}

【问题讨论】:

    标签: c# regex string


    【解决方案1】:

    这是一个可以完成这项工作的函数:

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

    【讨论】:

    • @Andrew:看起来您正在替换键,而不是值。请调整。
    • @David:你确定吗?在我看来是对的。可能的括号?或 & 和正则表达式中的键允许 Andrew 使用反向引用 $1 在替换字符串中包含原始键。通过仅在替换字符串中包含新值来丢弃旧值。
    • @brism - 谢谢,这正是正在发生的事情。 @GordonG - 我对编辑很好奇,你知道 stringString 在 C# 中是同义词吗?
    • @brism, Andrew:我今天早些时候可能已经离开了我的摇杆。我目前在这个答案中看到的是正确的。
    • 如果我的查询字符串中有一个空白值,那么 &foo= 会匹配失败吗?
    【解决方案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#? 中介绍了它的使用。

    【讨论】:

    • 我可能可以使用 String.Split。为什么正则表达式会矫枉过正?
    • @unknown:我的意思是,正则表达式模式的矫枉过正是出了名的痛苦。您可能会在有限的测试中看到成功,但随后一些小事情可能会使您的代码失败。我的回答并没有给你一个简单的方法来获取查询字符串的名称(例如,“Id”)并替换它的值,所以也许另一种方法会更成功。
    猜你喜欢
    • 2015-08-31
    • 2014-03-29
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多