在搜索特殊字符的变体时比较字符串(精确等...)

时间:2012-07-23 15:29:04

标签: vb.net string comparison

我想知道.net中是否有一种方法可以比较字符串,例如é。

示例:我正在搜索一个说José的字符串。当我检查字符串José是否包含“e”(没有精确)

时,我想返回true

有没有办法在不手动比较不同字符的所有变体的情况下执行此操作?

任何想法?

2 个答案:

答案 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

This link may be useful..

请注意,正则表达式需要以十六进制指定的unicode代码,而不是十进制。此外,此代码完全未经测试:)