Разделить предложение на слова, но возникли проблемы с пунктуации в C#

Я видел несколько подобных вопросов, но я пытаюсь добиться этого.

учитывая строку, str= " Луна - наш естественный спутник, то есть она вращается вокруг Земли!" Я хочу извлечь слова и сохранить их в массиве. Ожидаемыми элементами массива будут следующие.

the 
moon 
is 
our 
natural 
satellite 
i.e. 
it  
rotates 
around 
the 
earth

Я попытался использовать String.split (', 't','r'), но это работает неправильно. Я также попытался удалить ., и другие знаки препинания, но я бы хотел, чтобы строка типа "I. E." была проанализирована слишком. Каков наилучший способ достичь этого? Я также попытался использовать regex.раскол безрезультатно.

string[] words = Regex.Split(line, @"W+");

наверняка оценил бы некоторые толчки в правильном направлении.

4 ответов


решение регулярное выражение.

(\b[^\s]+\b)

и если действительно хочу исправить это последнее . on 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)