C#字符串修剪

时间:2013-07-28 00:41:00

标签: c# string

我在修剪这个字符串方面遇到了麻烦。我希望删除最后一个'/'后的所有内容,但有多个'/'。

示例:

自:http://stackoverflow.com/questions/ask/randomcrap.html

收件人:http://stackoverflow.com/questions/ask/

9 个答案:

答案 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)

我会使用正则表达式Replaceend ($) 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.Substringstring.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/