我想知道.net中是否有一种方法可以在字符串包含诸如é之类的字母时进行比较。
示例:我正在搜索一个显示 José 的字符串。当我检查字符串 José 是否包含“e”(没有精确值)时,我想返回 true
有没有办法在不手动比较不同字符的所有变体的情况下做到这一点?
有任何想法吗?
我想知道.net中是否有一种方法可以在字符串包含诸如é之类的字母时进行比较。
示例:我正在搜索一个显示 José 的字符串。当我检查字符串 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 代码。此外,此代码完全未经测试:)