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

StackOverflow https://stackoverflow.com/questions/7311734

Вопрос

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

Учитывая строку, 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top