繁体   English   中英

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

[英]How do I split a phrase into words using Regex in C#

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

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

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

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)]*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM