2012-07-23 34 views
3

我想知道在.net中是否有方法來比較字符串,如果它們包含字母,如é。當搜索特殊字符(accute等)的變化時比較字符串

例如:我正在搜索一個字符串,說何塞。當我檢查字符串José是否包含「e」(不含增值)時,我想返回true。

有沒有辦法在不比較所有不同字符的變體的情況下手動執行此操作?

有什麼想法?

+0

您需要製作某種替換圖並在比較之前「正常化」字符串... – 2012-07-23 15:33:40

回答

1

您將首先必須以某種方式定義變音符號。不要列出所有字符;相反,使用Unicode類別。只有兩種或三種組合標記可供思考。

例如,您可能只想檢測不影響基本字符寬度的組合標記(「非間距標記」)。或者你可能更自由一些,甚至包括不能單獨存在的標記,但在現場時仍佔用一些空間;像印度語腳本中的元音標記。

Private Shared Function HasDiacritics(input As String) As Boolean 
    Dim uncombined As String = input.Normalize(NormalizationForm.FormD) 

    For i As Integer = 0 To uncombined.Length - 1 
     Dim uc As UnicodeCategory = 
       CharUnicodeInfo.GetUnicodeCategory(uncombined(i)) 

     If uc = UnicodeCategory.NonSpacingMark 
       Or uc = UnicodeCategory.SpacingCombiningMark 
       Or uc = UnicodeCategory.EnclosingMark 
        Then 
         Return True 
     End If 
    Next 

    Return False 
End Function 

注意轉換到正常形式D.此查看由字符字符串的字符之前,如ée'強制所有字符組成的分解:所有這三種組合標記會作如下檢測。

現在等待,您問到了相反的情況,您想要檢測字符串是否包含特定的基本字符。這更簡單。

Private Shared Function HasChar(input As String, c as Char) As Boolean 
    Dim uncombined As String = input.Normalize(NormalizationForm.FormD) 

    For i As Integer = 0 To uncombined.Length - 1 
     If uncombined(i) = c Then Return True End If 
    Next 

    Return False 
End Function 

以類似的方式,您可以分開剝離每個字符串中特定類別的字符,並只比較剩餘的字符。

0

該函數應該用普通的舊「e」代替所有unicode E口音。你需要一個正則表達式來表示你想要「重音」的每個字母。爲了比較沒有口音,那麼你需要說...

If NormaliseAccents(string1) = NormaliseAccents(string2) Then... 

我還放在一個.ToLower()因此比較情況下,也忽略不計。

Imports System.Text.RegularExpressions 


Function NormaliseAccents(sIn as String) as String 
    Dim rex as Regex = New Regex("[\u00c8-\u00cb\u00e8-\u00eb]" , _ 
            RegexOptions.IgnoreCase) 

    sIn = rex.Replace(sIn , "e") 


    Return sIn.ToLower() 
End Function 

This link may be useful..

注意,正則表達式需要以十六進制指定的unicode碼,不是小數。此外,此代碼完全未經測試:)

+0

他仍然必須手動檢查所有變化... – Pacane 2012-07-23 16:18:26

+0

是的,添加所有變化/剝離它們是我我試圖避免,但是我所有的搜索都讓我相信這是唯一的方法。 – Eric 2012-07-23 16:29:39