15

我见过一些类似的问题,但我正在努力实现这一目标。

给定一个字符串,str="月球是我们的天然卫星,即它围绕地球旋转!" 我想提取单词并将它们存储在一个数组中。预期的数组元素将是这个。

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

我尝试使用 String.split(','\t','\r') 但这不能正常工作。我还尝试删除 . 和其他标点符号,但我也希望解析出像“ie”这样的字符串。实现这一目标的最佳方法是什么?我也尝试使用 regex.split 无济于事。

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

肯定会欣赏一些在正确方向上的推动。

4

4 回答 4

38

正则表达式解决方案。

(\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
于 2011-09-05T18:55:35.053 回答
8

我怀疑您正在寻找的解决方案比您想象的要复杂得多。您正在寻找某种形式的实际语言分析,或者至少是一本字典,以便您可以确定句点是单词的一部分还是句子的结尾。您是否考虑过它可能两者兼而有之的事实?

考虑添加允许的“包含标点符号的单词”的字典。这可能是解决您的问题的最简单方法。

于 2011-09-05T18:57:09.343 回答
1

这对我有用。

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!

您可以对结果进行一些后处理,删除逗号和分号等。

于 2011-09-05T18:53:01.050 回答
1
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value)
于 2011-09-05T19:06:31.227 回答