我想知道在.net中是否有方法來比較字符串,如果它們包含字母,如é。當搜索特殊字符(accute等)的變化時比較字符串
例如:我正在搜索一個字符串,說何塞。當我檢查字符串José是否包含「e」(不含增值)時,我想返回true。
有沒有辦法在不比較所有不同字符的變體的情況下手動執行此操作?
有什麼想法?
我想知道在.net中是否有方法來比較字符串,如果它們包含字母,如é。當搜索特殊字符(accute等)的變化時比較字符串
例如:我正在搜索一個字符串,說何塞。當我檢查字符串José是否包含「e」(不含增值)時,我想返回true。
有沒有辦法在不比較所有不同字符的變體的情況下手動執行此操作?
有什麼想法?
您將首先必須以某種方式定義變音符號。不要列出所有字符;相反,使用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
以類似的方式,您可以分開剝離每個字符串中特定類別的字符,並只比較剩餘的字符。
該函數應該用普通的舊「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
注意,正則表達式需要以十六進制指定的unicode碼,不是小數。此外,此代碼完全未經測試:)
您需要製作某種替換圖並在比較之前「正常化」字符串... – 2012-07-23 15:33:40