3

我想知道.net中是否有一种方法可以在字符串包含诸如é之类的字母时进行比较。

示例:我正在搜索一个显示 José 的字符串。当我检查字符串 José 是否包含“e”(没有精确值)时,我想返回 true

有没有办法在不手动比较不同字符的所有变体的情况下做到这一点?

有任何想法吗?

4

2 回答 2

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

类似地,您可以分别从每个字符串中去除特定类别的字符,只比较剩余的字符。

于 2012-07-23T21:15:36.897 回答
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 代码。此外,此代码完全未经测试:)

于 2012-07-23T15:52:28.787 回答