Ответ 1
Развернувшись на Ответ Шаня, я бы рассмотрел что-то вроде этого как отправную точку:
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 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." будет рассматриваться как четыре слова. Я думаю, что это также можно было бы включить, включив .
в качестве символа, который будет соответствовать слову, а затем удалит его, если он будет полностью остановлен после этого (то есть, проверив, что это единственный период в слове, а также последний символ).