如何在C#中使用Regex将短语拆分为单词

我试图使用正则表达式将句子/短语分成单词。

var phrase = "This isn't a test."; var words = Regex.Split(phrase, @"\W+").ToList(); 

单词包含“This”,“isn”,“t”,“a”,“test”

显然它正在捡起撇号并分裂。 我可以改变这种行为吗? 它还需要多语言支持各种语言(西class牙语,法语,俄语,韩语等)。

我需要将这些文字传递给拼写检查器。 特别是Nhunspell。

 return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList(); 

如果你想分成单词用于拼写检查,这是一个很好的解决方案:

 new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*") 

基本上你可以使用以前的正则表达式使用Regex.Split。 它使用unicode语法,因此它可以在多种语言中工作(但不适用于大多数亚洲语言)。 并且它不会破坏带有撇号的连字符。

使用Split()

 words = phrase.Split(' '); 

没有标点符号。

 words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'}); 

由于许多语言使用非常复杂的规则将单词串在一起成为短语和句子,因此您不能依赖简单的正则表达式来从一段文本中获取所有单词。 即使对于像英语一样“简单”的语言,你也可以在很多极端情况下运行,例如:

  • 如何处理像你这样的单词,并不是两个单词组合在一起的地方,而是一些字符替换为’。
  • 如何处理像夫人先生这样的缩写
  • 使用’ – ‘组合单词
  • 句子末尾带有连字符的单词。

众所周知,中文和日文(以及其他)难以用这种方式解析,因为这些语言不在单词之间使用空格,只在句子之间使用空格。

您可能希望阅读文本分割 ,如果分割对您很重要,请投资可以解析整个文本的拼写检查器或文本分割引擎,该引擎可以根据语言规则将您的句子分成单词。

我找不到一个基于.NET的多语言分段引擎,但快速谷歌搜索。 抱歉。

看起来你真的不需要正则表达式。 你可以这样做:

 phrase.Split(" "); 

你想分开什么? 空间? 标点? 你必须决定停止字符是什么。 使用空格和一些标点字符的简单正则表达式将是"[^.?!\s]+" 。 这会分解句号,问号,感叹号和任何空格字符。

如果您尝试仅基于空格进行拆分,则可以尝试。

 var words = Regex.Split(phrase, @"[^ ]+").ToList(); 

另一种方法是通过将撇号添加到您的角色类来添加撇号。

 var words = Regex.Split(phrase, @"(\W|')+").ToList(); 

否则,有没有特定的原因你不能使用string.Split()? 这似乎更直截了当。 此外,您还可以传入其他标点字符(即拆分。以及空格)。

 var words = phrase.Split(' '); var words = phrase.Split(new char[] {' ', '.'}); 

我不是一个java人,但你可以尝试在分裂时排除标点符号
空间同时。 也许这样的事情。

这些是原始的和扩展的正则表达式,单词在捕获组1中。
进行全球搜索。

Unicode(doesen’t帐户为字形)

 [\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]) )* ) 

ASCII

 [\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* ) 

这对我有用: [^(\d|\s|\W)]*