2011-09-05 36 views
8

我已经看到了一些类似的问题,但我试图做到这一点。将句子拆分为单词,但在C中出现问题时出现问题#

给定一个字符串,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+"); 

肯定会欣赏一些在正确方向上的微调。

+0

除非您添加已知以'.'结尾的单词列表,否则''''和'标点符号'中的第二个'.''是无法区分的。 – CodesInChaos

+12

我注意到月亮*围绕自己的轴旋转*。它围绕地球旋转。 –

回答

26

一个正则表达式的解决方案。

(\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 
+0

但是,这不会包含标点符号作为单词的一部分吗?所以在上面的例子中,最后一个单词是“Earth!” ... –

+0

不,它不符合地球上的标点符号。 '\ b'匹配单词边界。 – TheCodeKing

+0

@Thecodeking,怎么样匹配“即”?或者“u.n.i.c.e.f”之类的东西? –

2

这适用于我。

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! 

你可以做的结果的一些后期处理,去除逗号和分号等

+0

这是最好的解决方案吗?对于像这样的情况,后处理会被视为低效吗? –

8

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

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

+0

正则表达式与'\ b'做到这一点,所以你不必,当然,有一些灰色地带。例如,“即”,匹配为“例”。 – TheCodeKing

1
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value)