Разделите предложение на слова, но у меня проблемы с пунктивами в C#
Вопрос
Я видел несколько подобных вопросов, но я пытаюсь достичь этого.
Учитывая строку, STR = «Луна - наш естественный спутник, то есть она вращается вокруг Земли!» Я хочу извлечь слова и хранить их в массиве. Ожидаемые элементы массива будут такими.
the
moon
is
our
natural
satellite
i.e.
it
rotates
around
the
earth
Я пытался использовать string.split (',' t ',' r '), но это работает неправильно. Я также попытался удалить, и другие знаки препинания, но я бы хотел, чтобы такая струна, как «т.е.», была проанализирована. Как лучше всего это добиться? Я также пытался использовать regex.split безрезультатно.
string[] words = Regex.Split(line, @"\W+");
Наверняка оценит некоторые подталкивания в правильном направлении.
Решение
Решение режима.
(\b[^\s]+\b)
И если вы В самом деле хочу исправить это последним .
на i.e.
Вы можете использовать это.
((\b[^\s]+\b)((?<=\.\w).)?)
Вот код, который я использую.
var input = "The moon is our natural satellite, i.e. it rotates around the Earth!";
var matches = Regex.Matches(input, @"((\b[^\s]+\b)((?<=\.\w).)?)");
foreach(var match in matches)
{
Console.WriteLine(match);
}
Полученные результаты:
The moon is our natural satellite i.e. it rotates around the Earth
Другие советы
Я подозреваю, что решение, которое вы ищете, намного сложнее, чем вы думаете. Вы ищете какую -то форму фактического анализа языка или как минимум словарь, чтобы вы могли определить, является ли период частью слова или заканчивает предложение. Вы думали о том, что это может сделать и то, и другое?
Подумайте о добавлении словаря допустимых «слов, которые содержат пунктуацию». Это может быть самый простой способ решить вашу проблему.
Это работает для меня.
var str="The moon is our natural satellite, i.e. it rotates around the Earth!";
var a = str.Split(new char[] {' ', '\t'});
for (int i=0; i < a.Length; i++)
{
Console.WriteLine(" -{0}", a[i]);
}
Полученные результаты:
-The
-moon
-is
-our
-natural
-satellite,
-i.e.
-it
-rotates
-around
-the
-Earth!
Вы могли бы сделать некоторую постобработку результатов, удалить запятые и полуколоны и т. Д.
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value)