如何使用只替换www的第一次出现

时间:2012-12-07 19:29:03

标签: c# .net regex replace substring

在C#后面的代码中,我有以下代码。如何仅更改替换 www的第一次出现被取代了吗? 例如,如果用户输入www.testwww.com,那么我应该将其保存为testwww.com。 目前根据以下代码,它保存为www.com(猜测由于substr代码)。 请帮忙。提前谢谢。

private string FilterUrl(string url)
    {
        string lowerCaseUrl = url.ToLower();
        lowerCaseUrl = lowerCaseUrl.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty);
        lowerCaseUrl = lowerCaseUrl.Replace("www.", string.Empty);

        string lCaseUrl = url.Substring(url.Length - lowerCaseUrl.Length, lowerCaseUrl.Length);
        return lCaseUrl; 
    }

5 个答案:

答案 0 :(得分:3)

正如Ally建议的那样。使用System.Uri会更好。这也取代了你想要的领先的www。

private string FilterUrl(string url)
{
    Uri uri = new UriBuilder(url).Uri; // defaults to http:// if missing
    return Regex.Replace(uri.Host, "^www.", "") + uri.PathAndQuery;
}

编辑:尾部斜杠是由于PathAndQuery属性。如果没有路径,则只留下斜线。只需添加另一个正则表达式替换或字符串替换。这是正则表达式的方式。

return Regex.Replace(uri.Host, "^www.", "") + Regex.Replace(uri.PathAndQuery, "/$", "");

答案 1 :(得分:0)

Replace方法将更改字符串的所有内容。您必须使用IndexOf方法找到要删除的部分,然后使用Remove字符串方法删除。尝试这样的事情:

//include the namespace
using System.Globalization;


private string FilterUrl(string url)
{
    // ccreate a Comparer object.
    CompareInfo myCompare = CultureInfo.InvariantCulture.CompareInfo;

    // find the 'www.' on the url parameter ignoring the case.
    int position = myCompare.IndexOf(url, "www.", CompareOptions.IgnoreCase);

    // check if exists 'www.'  on the string.
    if (position > -1)
    {
      if (position > 0)
         url = url.Remove(position - 1, 5);
      else
         url = url.Remove(position, 5);
    }

    //if you want to remove http://, https://, ftp://.. keep this line
    url = url.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty);

    return url;
}   

编辑

您的代码中有一部分正在删除一段字符串。如果你只是想删除' www。'和' http://',' https://',' ftp://',看看这段代码。

此代码还会忽略比较url参数和您所查找的内容的情况,例如' www。'。

答案 2 :(得分:0)

我建议使用indexOf(string)来查找第一个匹配项。

编辑:好吧有人打败了我;)

答案 3 :(得分:0)

你可以像Felipe建议的那样使用IndexOf,或者用低技术方式来做..

 lowerCaseUrl = lowerCaseUrl.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty).Replace("http://www.", string.Empty).Replace("https://www.", string.Empty)

有兴趣知道你想要达到的目标。

答案 4 :(得分:0)

提出了一个很酷的静态方法,也适用于替换前x次出现:

public static string ReplaceOnce(this string s, string replace, string with)
{
    return s.ReplaceCount(replace, with);
}

public static string ReplaceCount(this string s, string replace, string with, int howManytimes = 1)
{
    if (howManytimes < 0) throw InvalidOperationException("can not replace a string less than zero times");
    int count = 0;
    while (s.Contains(replace) && count < howManytimes)
    {
        int position = s.IndexOf(replace);
        s = s.Remove(position, replace.Length);
        s = s.Insert(position, with);
        count++;
    }
    return s;
}

ReplaceOnce 不是必需的,只是一个简化器。这样称呼:

string url = "http://www.stackoverflow.com/questions/www/www";

var urlR1 - url.ReplaceOnce("www", "xxx");
// urlR1 = "http://xxx.stackoverflow.com/questions/www/www";


var urlR2 - url.ReplaceCount("www", "xxx", 2);
// urlR2 = "http://xxx.stackoverflow.com/questions/xxx/www";

注意:这是区分大小写的,因为它是