第一次出现char C后如何修剪字符串的结尾#

时间:2017-04-21 11:10:00

标签: c#

我希望在给定角色第一次出现之后修剪一个字符串的结尾,在这种情况下是'。'

此字符在字符串中多次出现。

  • 输入:143.122.124.123
  • 输出:143

我可以找到与此类似的多个问题,尽管他们都使用LastIndexOf();这需要第一次出现并删除其余的字符串。

4 个答案:

答案 0 :(得分:5)

input.Substring(0, input.IndexOf('.'))

说明:

  1. 使用String.IndexOf(char)在字符串中获取第一个char出现的从零开始的索引。例如。对于您的输入,它将是索引为3的第四个字符。
  2. 使用String.Substring(startIndex,length)从字符串的开头获取子字符串。使用char的索引作为子字符串的长度,因为索引是从零开始的。
  3. 注意:

    此解决方案的优点(与使用Split相比)是它不会在内存中创建数组,也不会遍历所有字符串搜索拆分字符和提取子字符串。

    这个解决方案的缺点是字符串必须包含至少一个你正在寻找的字符(感谢Ivan Chepikov提到它)。安全的替代方案看起来像

    int index = input.IndexOf('.');
    if (index != -1)
        substring = input.Substring(0, index);
    

    实际上,有很多选择可以做你想做的事情:

    1. input.Substring(0, input.IndexOf('.'))
    2. 简约input.Split('.')[0]
    3. 对于正则表达爱好者Regex.Match(input, @"[^\.]*").Value
    4. 对于LINQ疯子new string(input.TakeWhile(ch => ch != '.').ToArray())
    5. 清洁代码爱好者的扩展方法。 input.SubstringUpTo('.')

答案 1 :(得分:2)

string input = "143.122.124.123";
string output = input.Split('.')[0];

如果找不到Split字符,则会返回整个字符串。

答案 2 :(得分:1)

(我发布此仅仅是为了完整性 - 谢尔盖的答案似乎是正确和最简单的。)

(1)Linq方法:

s = new string(s.TakeWhile(c => c != '.').ToArray());

(2)与谢尔盖的答案相同,但使用Left()字符串扩展名

string s = "143.122.124.123";
s = s.Left(s.IndexOf('.'));

应该真的进行错误检查:

string s = "143.122.124.123";
int n = s.IndexOf('.');

if (n >= 0)
    s = s.Left(n);

注意:Left()方法实际上是一种扩展方法,所以它真的和谢尔盖的答案一样:

public static class StringExt
{
    public static string Left(this string self, int count)
    {
        string result = self.Length <= count 
            ? self 
            : self.Substring(0, count);

        return result;
    }
}

答案 3 :(得分:0)

现在我们疯了,坚持使用.LastIndexOf()

string input = "143.122.124.123";
string rev = new string(input.Reverse().ToArray());
string output = new string(rev.Substring(rev.LastIndexOf('.') + 1).Reverse().ToArray());