簡體   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