我在修剪这个字符串方面遇到了麻烦。我希望删除最后一个'/'后的所有内容,但有多个'/'。
示例:
自:http://stackoverflow.com/questions/ask/randomcrap.html
收件人:http://stackoverflow.com/questions/ask/
答案 0 :(得分:10)
可以使用许多内置的字符串utlitites来完成字符串修剪。
首先,您希望字符串中包含LastIndexOf
“/”字符,然后您需要使用Substring
索引({1}}(字符串的开头)到0
方法/
字符的索引。现在,如果你想要包含斜杠,你可以将所有内容返回到最后一个/
。
static string getToLastSlash(string inString)
{
var index = inString.LastIndexOf('/');
if (index == -1)
throw new Exception("/ not found in string");
return inString.Substring(0, index + 1);
}
LastIndexOf()
方法将返回所提供的特定字符或字符串的最后一个索引。如果LastIndexOf()
方法未评估匹配项,则结果为-1
。鉴于您可能不匹配,您必须首先检查匹配结果是否为-1
。在上面的方法中,我们只是抛出异常,但是你的应用程序可能有另一种方法来处理这种情况。
如果匹配大于-1
,那么您可以假设找到匹配项。找到匹配项后,您可以使用Substring()
方法将字符串中从位置0
开始的所有字符解析为index+1
。
答案 1 :(得分:3)
我会使用正则表达式Replace和end ($
) anchor。
var res = Regex.Replace(input,
@"[^/]+$", // match all the non-slashes anchored to the end of input
""); // replace any matched characters with nothing
// and make sure to use "res"
我更喜欢使用正则表达式来完成这样的任务 - 因为我发现它更简单,它可以避免额外的条件保护“免费” - 但要确保理解方法的机制使用
答案 2 :(得分:2)
合并string.Substring
和string.LastIndexOf
应该可以解决问题。
答案 3 :(得分:2)
我认为您可以使用Uri类
来完成此操作Uri parent = new Uri(uri, ".");
答案 4 :(得分:1)
最简单的方法可能是
string myURL = "http://stackoverflow.com/questions/ask/randomcrap.html";
string str = myURL.Substring(0, myURL.LastIndexOf('/'));
Console.WriteLine(str);
将输出
http://stackoverflow.com/questions/ask
答案 5 :(得分:0)
您可以Split
字符'/'
然后将其转换为List<string>
并移除最后一项,最后使用string.Join
var url = "http://stackoverflow.com/questions/ask/randomcrap.html";
var b = url.Replace("http://", "").Split('/').ToList(); //replace "html://" to avoid problems with the split
b.RemoveAt(b.Count-1); //last index
var result = "http://" + string.Join("/", b) + "/";
result
等于"http://stackoverflow.com/questions/ask/"
这将允许您删除任何您想要的部分
不要忘记你也可以使用b.RemoveRange(int index, int count)
;
答案 6 :(得分:0)
您可以像这样使用LastIndexOf
string str = "http://stackoverflow.com/questions/ask/randomcrap.html";
string final = RemoveAfterLastChar(str, '/');
public string RemoveAfterLastChar(string input, char c)
{
var index = input.LastIndexOf(c);
if (index != -1)
return input.Substring(0, index + 1);
else
return input;
}
或者,如果格式总是与您的示例相同,则可以使用Path.GetDirectoryName。
input = Path.GetDirectoryName(input);
答案 7 :(得分:0)
void Main()
{
Console.WriteLine (TrimLastPart("http://stackoverflow.com/questions/ask/randomcrap.html"));
Console.WriteLine (TrimLastPart("http://stackoverflow.com/questions/ask//randomcrap.html"));
}
enum State
{
SlashNotEncountered,
SlashEncountered,
BuildingResult
}
string TrimLastPart(string input)
{
string result = string.Empty;
State state = State.SlashNotEncountered;
foreach (var c in input.ToCharArray().Reverse())
{
switch (state)
{
case State.SlashNotEncountered:
if(c == '/')
{
state = State.SlashEncountered;
}
break;
case State.SlashEncountered:
if(c != '/')
{
state = State.BuildingResult;
result = c.ToString();
}
break;
case State.BuildingResult:
result = c + result;
break;
}
}
return result + "/";
}
<强>输出:强>
http://stackoverflow.com/questions/ask/
http://stackoverflow.com/questions/ask/
答案 8 :(得分:0)
如果你想查找最后的'/'字符,只需使用String LastIndexOf 方法:
String text = @"http://stackoverflow.com/questions/ask/randomcrap.html";
String result = text;
int index = text.LastIndexOf('/'); // <- last '/' if any
if (index >= 0) // <- if there's '/' within the string, trim it
result = text.Substring(0, index + 1);
...
Console.Out.Write(result); // <- http://stackoverflow.com/questions/ask/