如何将文本拆分成单词?
示例文本:
:“哦,你没办法,”猫说,“我们都疯了。我疯了,你也疯了。”
这一行中的单词是:
发布于 2013-05-24 20:11:42
用空格拆分文本,然后裁剪标点符号。
var text = "'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'";
var punctuation = text.Where(Char.IsPunctuation).Distinct().ToArray();
var words = text.Split().Select(x => x.Trim(punctuation));
与示例完全一致。
发布于 2013-05-24 08:06:11
首先,删除所有特殊字符:
var fixedInput = Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty);
// This regex doesn't support apostrophe so the extension method is better
然后拆分它:
var split = fixedInput.Split(' ');
对于删除特殊字符(您可以轻松更改)的更简单的C#解决方案,添加此扩展方法(我添加了对撇号的支持):
public static string RemoveSpecialCharacters(this string str) {
var sb = new StringBuilder();
foreach (char c in str) {
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '\'' || c == ' ') {
sb.Append(c);
}
}
return sb.ToString();
}
然后像这样使用它:
var words = input.RemoveSpecialCharacters().Split(' ');
你会惊讶地发现这个扩展方法非常有效(肯定比正则表达式更有效),所以我建议你使用它;)
更新
我同意这是一种纯英语的方法,但要使其与Unicode兼容,您所要做的就是替换:
(c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
通过以下方式:
char.IsLetter(c)
支持Unicode,.Net还为您提供了适用于各种情况的char.IsSymbol
和char.IsLetterOrDigit
。
发布于 2013-05-24 08:13:01
只需在@Adam Fridental的答案上添加一个变体,这是非常好的,你可以尝试这个Regex:
var text = "'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'";
var matches = Regex.Matches(text, @"\w+[^\s]*\w+|\w");
foreach (Match match in matches) {
var word = match.Value;
}
我相信这是能得到所有单词的最短的RegEx
\w+[^\s]*\w+|\w
https://stackoverflow.com/questions/16725848
复制相似问题