【问题标题】:How to trim the end of a string after the first occurrence of a char C#如何在第一次出现char C#后修剪字符串的结尾
【发布时间】:2017-04-21 11:10:00
【问题描述】:

我想在给定字符第一次出现后修剪字符串的结尾,在本例中为 '.'

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

  • 输入:143.122.124.123
  • 输出:143

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

【问题讨论】:

标签: c#


【解决方案1】:
input.Substring(0, input.IndexOf('.'))

解释:

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

注意:

此解决方案的优点(与使用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('.')

【讨论】:

  • 最好检查 input.IndexOf('.') != -1 以确保输入包含字符。
【解决方案2】:
string input = "143.122.124.123";
string output = input.Split('.')[0];

如果找不到Split 字符,这将返回整个字符串。

【讨论】:

  • input.Split(new char[] {'.'}, 2) 是更好的选择(如果长字符串有很多点)
  • @DmitryBychenko 实际上我认为您可以将计数传递为1 而不是2
  • @Matthew Watson:抱歉,我们想要2 项目,它们是:143122.124.123
  • @DmitryBychenko 啊是的,当然了,即使你只想要一个部分,你也必须通过2,否则它不会分裂它。
  • @Matthew Watson:我的消息是output = input.Split(new char[] {'.'}, 2)[0];,我们将input 拆分为一个数组,其中最多包含2 项-["143", "122.124.12"],然后取第一个-"143"
【解决方案3】:

(我发布此内容只是为了完整性 - Sergey 的回答似乎是正确且最简单的。)

(1) 一种 Linq 方法:

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

(2) 与 Sergey 的回答相同,但使用 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() 方法实际上是一个扩展方法,所以真的和 Sergey 的回答一样:

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;
    }
}

【讨论】:

  • 你能给Left方法文档的链接吗?
  • @SergeyBerezovskiy 哎呀我不小心使用了扩展方法;我会添加它!
  • 谢谢,现在很清楚了。我以为我错过了一些框架更新:)
  • @SergeyBerezovskiy 我使用这些字符串扩展已经很多年了,我完全忘记了它们不是标准.Net 库的一部分!很抱歉造成混乱。
【解决方案4】:

现在我们变得疯狂并坚持使用.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());

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多