【发布时间】:2020-03-03 04:17:53
【问题描述】:
我有一个字符串:
var text = @"
I have a long string with a load of words,
and it includes new lines and non-letter characters.
I want to remove all of them and split this text to have one word per line, then I can count how many of each word exist."
删除所有非字母字符,然后将每个单词拆分到新行以便我可以存储和计算每个单词有多少的最佳方法是什么?
var words = text.Split(' ');
foreach(var word in words)
{
word.Trim(',','.','-');
}
我尝试了各种方法,例如 text.Replace(characters) 和 whitespace 然后拆分。我已经尝试过 Regex(我不想使用它)。
我还尝试使用 StringBuilder 类从文本(字符串)中获取字符,并且仅在它是字母 a-z / A-Z 时附加字符。
还尝试调用 sb.Replace 或 sb.Remove 我不想要的字符,然后再将它们存储在字典中。但我似乎最终还是得到了我不想要的角色?
我尝试的一切,我似乎至少有一个我不想要的角色,并且无法弄清楚为什么它不起作用。
谢谢!
【问题讨论】:
-
Trim()从方法调用返回修剪后的字符串,它不会改变您调用Trim()的字符串。您需要调整代码以使用对Trim()的调用返回的值,并使用结果更新您的单词数组。 -
您必须将它们移动到新行吗?您可以尝试使用正则表达式来查看有多少字符串与您的正则表达式匹配?
-
一个简单的正则表达式将捕获所有单词而不生成所有字符串拆分将,例如
Regex.Matches(@"\w+")将捕获所有连续单词字符。匹配计数将是单词的数量。 Word characters 包含数字。"[a-zA-Z]+"将只捕获英文字母,而"\p{L}+"将捕获字母,无论是哪种语言 -
non-letter算一两个字吗?你想跳过数字太像this is a 10 number将是 4 个字? -
非字母将是两个单词,理想情况下,我会将连字符替换为空格,这样我就可以将每个单词拆分到一个新行中。我的文本中实际上没有任何数字,所以在这个阶段它并不重要,但我可能会选择跳过它们
标签: c# string word-count distinct-values