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

时间:2012-04-20 02:38:12

标签: c# regex

我正在尝试使用正则表达式将句子/短语拆分为单词。

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

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

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

我需要将单词传递给拼写检查程序。特别是Nhunspell。

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

8 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:3)

使用Split()

words = phrase.Split(' ');

没有标点符号。

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

答案 2 :(得分:3)

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

  • 如何处理像你这样的单词,不是两个单词组合在一起的地方,而是用'。
  • 替换了一些字符。
  • 如何处理Mrs. Mrs。等缩写。
  • 使用' - '
  • 组合词
  • 句子末尾带有连字符的单词。

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

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

我找不到基于.NET的多语言分词引擎,但快速谷歌搜索。遗憾。

答案 3 :(得分:1)

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

phrase.Split(" ");

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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[] {' ', '.'});

答案 6 :(得分:0)

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

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

Unicode(不考虑字形)

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

Ascii

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

答案 7 :(得分:0)

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