如何在 C# 中使用正则表达式将短语拆分为单词

本文关键字:短语 拆分 单词 正则表达式 | 更新日期: 2023-09-27 18:31:40

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

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

单词包含"这个"、"是"、"t"、"a"、"test"

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

我需要将单词传递给拼写检查器。 特别是恩斯佩尔。

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

如何在 C# 中使用正则表达式将短语拆分为单词

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

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

基本上你可以使用以前的正则表达式来使用Regex.Split。它使用Unicode语法,因此它可以在多种语言中工作(尽管不适用于大多数亚洲人)。而且它不会用撇号或连字符破坏单词。

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

  • 如何处理像你这样的单词,不是两个单词组合在一起并且许多字符替换为".
  • 如何处理缩写,例如Mrs夫人,即
  • 使用"-"的组合词
  • 句子末尾的连字符单词。
  • 像奥布莱恩和奥康尼尔这样的名字。

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

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

不过,我找不到带有快速谷歌搜索的基于 .NET 的多语言细分引擎。不好意思。

使用 Split()

words = phrase.Split(' ');

没有标点符号。

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

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

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

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

另一种方法是通过将撇号添加到字符类来添加撇号。

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

否则,是否有不能使用字符串的特定原因。分裂()?这似乎要简单得多。此外,您还可以传入其他标点符号字符(即拆分为 . 以及空格)。

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

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

phrase.Split(" ");

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

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

Unicode(不考虑字素)

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

阿西

['s[:punct:]]* ('w (?: 'w | [[:punct:]](?=['w[:punct:]]) )* )
这对

我有用:[^('d|'s|'W)]*