2012-04-20 64 views
6

我正在嘗試使用正則表達式將單詞拆分爲單詞。如何在C中使用正則表達式將短語拆分爲單詞#

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

詞包含 「這」, 「ISN」, 「T」, 「A」, 「測試」

顯然,這是撿了上撇號和分裂。我可以改變這種行爲嗎?它還需要支持多種語言(西班牙文,法文,俄文,韓文等)。

我需要將單詞傳遞給拼寫檢查器。具體Nhunspell。

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

嘗試在空間上拆分?你有很好的用例來證明這個正則表達式需要處理什麼? – mellamokb 2012-04-20 02:41:24

+0

我傳遞到了一個拼寫檢查的話,所以我需要減肥的標點符號。 – Dean 2012-04-20 02:45:28

+0

由於要分割爲多個不同的語言,你需要使用哪個懂一門語言一個標記。在你的例子中,不明確是一個詞,但在另一種語言中,'通常可能不是該詞的一部分。因此大多數拼寫檢查庫都附帶Tokenizer或Parser,它們可以爲您完成這項工作。 – jessehouwing 2012-04-20 09:28:05

回答

7

如果你想分成進行拼寫檢查的目的的話,這是一個很好的解決方案:

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

基本上你可以使用Regex.Split使用以前的正則表達式。 它使用unicode語法,所以它可以在幾種語言中工作(儘管對於大多數亞洲人來說都不是)。 它不會打破帶撇號的單詞。

4

使用Split()

words = phrase.Split(' '); 

沒有標點符號。

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

它似乎並不像你需要一個正則表達式。你可以這樣做:

phrase.Split(" "); 
+0

只有當你想在你的話標點符號。 – 2012-04-20 02:54:10

1

你想拆分什麼?空間?標點?你必須決定停止字符是什麼。一個簡單的正則表達式,使用空格和一些標點符號將是"[^.?!\s]+"。這將分裂在期間,問號,感嘆號和任何空格字符。

+0

我還需要考慮西班牙語,它會有驚歎和顛倒的問題。 – Dean 2012-04-20 02:47:25

+0

然後內部的'[]'和''^後的那些字符添加到字符的列表。所以,例如''[^。?!'s]「'。您可能需要添加括號,逗號,分號和許多其他標點符號。該列表是你*不想要的字符*。開頭的'^'的意思是「不是這些字符。」因此,您還需要將脫字符(^)字符添加到列表中。 – 2012-04-20 02:50:28

+0

好吧,我要看看我能做些什麼來獲取標點符號列表。我喜歡這種方法。 – Dean 2012-04-20 02:56:58

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[] {' ', '.'}); 
0

我不是一個java的人,但你可以嘗試在同一時間,以排除對
空間標點符號而分裂。也許這樣的東西。

這些是原始和擴展的正則表達式,單詞在捕獲組1中。
執行全局搜索。

的Unicode(doesen't佔字形的)

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

Ascii碼

3

由於這樣的事實,一些語言使用非常複雜的規則來串詞連成短語和句子,你不能依賴於一個簡單的正則表達式來獲取所有從一段文字的話。即使是一個語言「簡單」的英語,你會在一些極端情況,如運行:

  • 如何像你處理的話,是不是那裏的兩個詞結合等一批字符替換爲'。
  • 如何處理縮寫如夫人先生即使用
  • 複詞「 - 」
  • 在句末連字符的單詞。

中國和日本(等等)是出了名的難以解析這種方式,因爲這些語言不使用單詞之間的空格,只有句子之間。

您可能需要閱讀Text Segmentation,如果分段對於您投資可以解析整個文本的拼寫檢查器或文本分段引擎來說非常重要,該引擎可以根據語言。

我無法找到一個快速谷歌搜索基於.NET多語種分割引擎雖然。抱歉。

0

這對我有效:[^(\d|\s|\W)]*

相關問題