我想知道.net中是否有一种方法可以比较字符串,例如é。
示例:我正在搜索一个说José的字符串。当我检查字符串José是否包含“e”(没有精确)
时,我想返回true有没有办法在不手动比较不同字符的所有变体的情况下执行此操作?
任何想法?
答案 0 :(得分: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
类似地,您可以分别从每个字符串中删除特定类别的字符,并仅比较剩余的字符。
答案 1 :(得分: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
请注意,正则表达式需要以十六进制指定的unicode代码,而不是十进制。此外,此代码完全未经测试:)