2010-04-19 61 views
1

我正在使用VB .NET編寫一個程序,該文件將從sup文本文件中獲取單詞並計算每個單詞出現的次數。我正在使用這個正則表達式: -.NET正則表達式在文本中查找實際文字

parser As New Regex("\w+") 

它給了我幾乎100%正確的單詞。除了當我有像

「Ms Word的應用程序文件名是word.exe」。或者「這是一個C#語句If(a> b?1,0)?」

在這種情況下,我得到[單詞& exe]和[如果a,b,1和0]爲單獨的單詞。這將是很好的(我的目的),我收到word.exe和(如果(a> b?1,0)作爲單詞

我猜\ w +尋找空白,句子終止標點符號和其他標點符號標記以確定一個單詞

我想要一個類似的正則表達式,如果標點符號不是單詞的結尾,那麼它不會打破標點符號的單詞,我認爲單詞的結尾可以由一個尾隨的WhiteSpace,句子終止標點符號(你可能會想到其他人),如果你可以給VB.NET建議一些正則表達式9),這將是很大的幫助。

謝謝。

+0

剛剛閱讀和發揮 – kenny 2010-04-19 19:54:32

回答

0

如果我們假設。用後它是一種空間上了一個句號那麼這個表達式應該工作

[\w(?!\S)\.]+ 
+0

@ Hun1Ahpu:這是目前爲止效果最好的。唯一的問題是,對於句末的單詞,它包括終端FullStop(。),Questionmark(?)和感嘆號(!)。如果一個單詞以逗號(,)結尾,則此RegEx也包含它。像:「我喜歡芒果,橙子和香蕉。」將獲得「芒果」,「橙色」和「香蕉」。作爲單詞。但如果我有「芒果」,「橙色」和「香蕉」,那將是完美的。 – 2010-04-19 21:15:48

+0

@ Hun1Ahpu :(續) 此RegEx完美地捕獲了word.exe。並且如果(a>b≥1,0)被捕獲爲「If(a>b≥1,0)」。由於終止FullStop(。)。 我可以手動遍歷每個單詞,查找+省略尾隨逗號,FullStop,感嘆號,括號等,但如果這可以由RegEx處理,那對我來說100%完美。感謝'迄今'最佳答案! – 2010-04-19 21:16:07

+0

'[\ w(?!\ S)\。]'是一個匹配任何一個字符的字符類,它是:單詞字符('\ w');一個非空白字符('\ S');或'(','?','!',')'或'.'中的一個。如果這個正則表達式爲你工作,@Mehdi,這是偶然的;如果你使用'\ S +',你會得到完全相同的結果。 – 2010-04-20 06:33:35

0

不是一個正則表達式本身,而是你可能只是這樣做:從內存中這麼寫可能

Dim words() As String = myString.Replace(". ", " ").Split(" "c) 

(代碼將不會像這樣編譯)

編輯:意識到代碼可以簡單化。

+0

@ho:您的解決方案不包括以「?」結尾的句子要麼 」!」。我將使用替換+分割作爲最後的手段。 – 2010-04-19 20:55:15

0

這個表達基於快報的默認示例文本相當不錯(雖然不是完美的)結果:

((?:\w+[.\-!?#'])*\w+)(?=\s) 
+0

此regEx未捕獲word.exe。我想word.exe作爲一個詞。它把'陳述'作爲硬道理,在此之後不包括任何內容。所以如果(a> b?1,0)部分完全被忽略。但我仍然希望那部分是一個字。感謝這篇文章。 – 2010-04-19 20:52:33

+0

嗯。聽起來像我需要更努力! – 2010-04-19 21:31:07

0

我想我張貼在註釋部分的代碼,但是它太長了點。我回答我自己的問題的答案確實來自Hun1Ahpu & Alan Moore。

我粘貼我的代碼,關於如何從單詞中刪除尾標點符號。

Private mstrPunctuations As String = ",.'""`[email protected]#$%^&*()_-+=?" 
Dim parser As New Regex("\S+") 
     Me.mintWordCount = parser.Matches(CleanedSource).Count 
     For Each Word As Match In parser.Matches(CleanedSource) 
      Dim NeedChange As Boolean = False 
      For Each aChar As Char In Me.mstrPunctuations.ToCharArray() 
       If Word.Value.EndsWith(aChar) Then 
        NeedChange = True 
        Exit For 
       End If 
      Next 
      If NeedChange Then 
       SetStringStat(Word.Value.Substring(0, Word.Value.Length - 1)) 
      Else 
       SetStringStat(Word.Value) 
      End If 
     Next 
相關問題