如果我有以下字符串:
/lorem/ipsum/dolor
我希望它变成:
/lorem/ipsum
删除最后一个正斜杠及其后面的所有字符的简写方法是什么?
我知道如何通过将字符串拆分为 aList<>
并删除最后一项,然后加入来做到这一点,但是有没有更短的方法来写这个?
我的问题不是特定于 URL 的。
您可以使用Substring()
和LastIndexOf()
:
str = str.Substring(0, str.LastIndexOf('/'));
编辑(建议评论)
为了防止字符串可能不包含 a 时出现任何问题/
,您可以使用类似:
int lastSlash = str.LastIndexOf('/');
str = (lastSlash > -1) ? str.Substring(0, lastSlash) : str;
将位置存储在临时变量中可以避免调用.LastIndexOf('/')
两次,但可以放弃它以支持单行解决方案。
如果网址末尾有“/”,请将其删除。如果不; 只需退回原件。
var url = this.Request.RequestUri.ToString();
url = url.EndsWith("/") ? url.Substring(0, url.Length - 1) : url;
url += @"/mycontroller";
您可以执行类似的操作str.Remove(str.LastIndexOf("/"))
,但没有内置方法可以执行您想要的操作。
编辑:你也可以使用 Uri 对象来遍历目录,虽然它并没有给出你想要的:
Uri baseUri = new Uri("http://domain.com/lorem/ipsum/dolor");
Uri myUri = new Uri(baseUri, ".");
// myUri now contains http://domain.com/lorem/ipsum/
一种简单的方法是
String s = "domain.com/lorem/ipsum/dolor";
s = s.Substring(0, s.LastIndexOf('/'));
Console.WriteLine(s);
另一个也许
String s = "domain.com/lorem/ipsum/dolor";
s = s.TrimEnd('/');
Console.WriteLine(s);
您可以使用正则表达式/[^/]*$
并替换为空字符串:
var fixed = new Regex("/[^/]*$").Replace("domain.com/lorem/ipsum/dolor", "")
但这里可能有点矫枉过正。@newfurniturey 对 with 的回答Substring
可能LastIndexOf
是最好的。
我喜欢为这样的东西创建一个字符串扩展:
/// <summary>
/// Returns with suffix removed, if present
/// </summary>
public static string TrimIfEndsWith(
this string value,
string suffix)
{
return
value.EndsWith(suffix) ?
value.Substring(0, value.Length - suffix.Length) :
value;
}
然后你可以像这样使用:
var myString = "/lorem/ipsum/dolor";
myStringClean = myString.TrimIfEndsWith("/dolor");
您现在在所有项目中都有一个可重复使用的扩展,可用于删除一个或多个尾随字符。
using System.IO;
mystring.TrimEnd(Path.AltDirectorySeparatorChar); // To remove "/"
mystring.TrimEnd(Path.DirectorySeparatorChar); // To remove "\"
谢谢@Curt 的提问。我稍微改进了@newfurniturey 的代码,这是我的版本。
if(str.Contains('/')){
str = str.Substring(0, str.LastIndexOf('/'));
}
while (input.Last() == '/' || input.Last() == '\\')
{
input = input.Substring(0, input.Length - 1);
}