从字符串中获取第一个单词。

14
我想要获得字符串的第一个单词,而不考虑它前面的任何字符或标点符号。有时候会出现逗号、句号或感叹号等字符,我不想要这些字符。
var s = "Hello, World";
var firstWord = s.Substring(0, s.IndexOf(" "));

这给了我Hello,。我想要只得到Hello

我该如何实现?


你能接受正则表达式吗? - Kevin Law
当然可以,但我不知道如何使用它 :) - Fast Chip
1
如果不熟悉正则表达式,请尝试使用“Split”。 - Nkosi
1
我会首先使用Replace()函数来删除任何您不想考虑的标点符号/字符。 - Jesse Q
4个回答

9

只需使用以下正则表达式:

var s = "Hello, World";
var result = Regex.Match(s, @"^([\w\-]+)");
Console.WriteLine(result.Value); // Result is "Hello"

无论单词是否以标点符号结尾或仅是前面有空格,此代码将获取第一个单词。


1
结果值将是单词。 - Gaurang Dave
@GaurangDave 对的。 Console.WriteLine(result) 打印出了 "Hello",因为 MatchToString() 实现。感谢您的澄清。 - Jake Miller

7
这对您有用。我假设单词将以空格分隔。
var input = "Hello, World";
var output = Regex.Replace(input.Split()[0], @"[^0-9a-zA-Z\ ]+", "");

@MahadevanSwamy 您好,欢迎您。请将其标记为答案,以便其他人也可以受益。谢谢 :) - Gaurang Dave
1
小心。这个程序不能处理像“让我们去商场”的句子。因为正则表达式替换正在剥离所有非字母数字字符,所以第一个单词将是“Lets”。 - Justin J Stark

4

晚点入门:
如果您不想使用正则表达式:

    private string GetFirstWord(string text)
    {
        var candidate = text.Trim();
        if (!candidate.Any(Char.IsWhiteSpace))
            return text;

        return candidate.Split(' ').FirstOrDefault();
    }

1

IndexOfAny (https://msdn.microsoft.com/fr-ca/library/11w09h50(v=vs.110).aspx)是一种替代方法,如果您知道要使用的字符列表。这真的取决于您想要使用的定义以及您想要处理哪些字符。您想如何处理像œ、é、µ、½、¶、ç、+、-、3等字符?

此外,您是否想处理语言环境,因为某些字符可能具有依赖于语言的分类。

Char有许多函数,可以让您对字符进行分类。请参见https://msdn.microsoft.com/en-us/library/system.char(v=vs.110).aspx

还有其他人提出的正则表达式解决方案。

因此,最佳解决方案确实取决于您的需求。您需要正确处理任何Unicode字符还是仅特定的ASCII字符?


不要忘记处理只有一个单词(没有分隔符字符)的情况 - 索引将为-1。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接