在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;
}
答案 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";
注意:这是区分大小写的,因为它是