7

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

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();
4

8 回答 8

11

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

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

基本上,您可以使用以前的正则表达式来使用 Regex.Split。它使用 unicode 语法,因此它可以在多种语言中使用(尽管不适用于大多数亚洲语言)。它不会用撇号或连字符打断单词。

于 2012-04-20T04:07:04.493 回答
4

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

  • 如何处理像你这样的单词,不是将两个单词组合在一起并且将许多字符替换为'。
  • Mr. Mrs. ie 等缩写如何处理
  • 使用'-'组合词
  • 句末的连字符。
  • 像 O'Brian 和 O'Connel 这样的名字。

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

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

不过,我找不到一个基于 .NET 的多语言分割引擎和一个快速的谷歌搜索。对不起。

于 2012-04-20T09:51:14.460 回答
3

使用Split().

words = phrase.Split(' ');

没有标点符号。

words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'});
于 2012-04-20T02:41:58.477 回答
1

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

于 2012-04-20T02:42:57.987 回答
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[] {' ', '.'});
于 2012-04-20T02:43:12.430 回答
0

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

phrase.Split(" ");
于 2012-04-20T02:42:09.937 回答
0

我不是 java 人,但您可以尝试在分割
空格的同时排除标点符号。可能是这样的。

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

Unicode(不考虑字形)

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

ASCII

[\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* )
于 2012-04-20T03:51:53.757 回答
0

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

于 2013-07-31T16:47:49.397 回答