我想知道在.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