我希望在给定角色第一次出现之后修剪一个字符串的结尾,在这种情况下是'。'
此字符在字符串中多次出现。
我可以找到与此类似的多个问题,尽管他们都使用LastIndexOf()
;这需要第一次出现并删除其余的字符串。
答案 0 :(得分:5)
input.Substring(0, input.IndexOf('.'))
说明:
String.IndexOf(char)
在字符串中获取第一个char出现的从零开始的索引。例如。对于您的输入,它将是索引为3
的第四个字符。String.Substring(startIndex,length)
从字符串的开头获取子字符串。使用char的索引作为子字符串的长度,因为索引是从零开始的。注意:
此解决方案的优点(与使用Split
相比)是它不会在内存中创建数组,也不会遍历所有字符串搜索拆分字符和提取子字符串。
这个解决方案的缺点是字符串必须包含至少一个你正在寻找的字符(感谢Ivan Chepikov提到它)。安全的替代方案看起来像
int index = input.IndexOf('.');
if (index != -1)
substring = input.Substring(0, index);
实际上,有很多选择可以做你想做的事情:
input.Substring(0, input.IndexOf('.'))
input.Split('.')[0]
Regex.Match(input, @"[^\.]*").Value
new string(input.TakeWhile(ch => ch != '.').ToArray())
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());