如何在c#中获取字符串的所有单词?

时间:2011-02-11 15:04:45

标签: c# string

我在一个字符串中有一个段落,我想得到该段落中的所有单词。

我的问题是我不希望后缀的单词以标点符号结尾,例如(',','。',''',''',';',':','!' ,'?')和/ n / t等。

我也不想要像'world's之类的单词,只能返回世界。

在示例中 he said. "My dog's bone, toy, are missing!"

列表应为:he said my dog bone toy are missing

5 个答案:

答案 0 :(得分:25)

扩展Shan's answer,我会考虑这样的出发点:

MatchCollection matches = Regex.Match(input, @"\b[\w']*\b");

为什么要包含'字符?因为这会阻止像“我们”这样的单词被分成两个单词。捕获后,您可以自己手动删除后缀(否则,您无法识别re不是单词而忽略它。)

所以:

static string[] GetWords(string input)
{
    MatchCollection matches = Regex.Matches(input, @"\b[\w']*\b");

    var words = from m in matches.Cast<Match>()
                where !string.IsNullOrEmpty(m.Value)
                select TrimSuffix(m.Value);

    return words.ToArray();
}

static string TrimSuffix(string word)
{
    int apostropheLocation = word.IndexOf('\'');
    if (apostropheLocation != -1)
    {
        word = word.Substring(0, apostropheLocation);
    }

    return word;
}

示例输入:

he said. "My dog's bone, toy, are missing!" What're you doing tonight, by the way?

示例输出:

[he, said, My, dog, bone, toy, are, missing, What, you, doing, tonight, by, the, way]

这种方法的一个限制是它不能很好地处理首字母缩略词;例如,“Y.M.C.A。”将被视为四个字。我认为这也可以通过将.作为一个字符匹配来处理,然后在事后完全停止时将其剥离(即通过检查它是期间在单词和最后一个字符中。)

答案 1 :(得分:3)

希望这对你有所帮助:

        string[] separators = new string[] {",", ".", "!", "\'", " ", "\'s"};
        string text = "My dog's bone, toy, are missing!";

        foreach (string word in text.Split(separators, StringSplitOptions.RemoveEmptyEntries))
            Console.WriteLine(word);

答案 2 :(得分:1)

请参阅Regex word boundary expressionsWhat is the most efficient way to count all of the words in a richtextbox?。故事的道德是有很多方法来解决问题,但正则表达式可能是简单的方法。

答案 3 :(得分:0)

在空格上拆分,修剪结果字符串上不是字母的任何内容。

答案 4 :(得分:-1)

这是一个循环替换方法......不是很快,但是解决它的方法......

string result = "string to cut ' stuff. ! out of";

".',!@".ToCharArray().ToList().ForEach(a => result = result.Replace(a.ToString(),""));

这假设您要将其放回原始字符串中,而不是新字符串或列表。