我正在尝试使用正则表达式将句子/短语拆分为单词。
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();
答案 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)
由于许多语言使用非常复杂的规则将单词串在一起成为短语和句子,因此您不能依赖简单的正则表达式来获取一段文本中的所有单词。即使对于像英语这样“简单”的语言,你也会遇到许多极端情况,例如:
中文和日文(以及其他)众所周知难以用这种方式解析,因为这些语言不会在单词之间使用空格,只会在句子之间使用空格。
您可能希望阅读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)]*