Vb.net 搜索特殊字符(accute等)的变化时比较字符串

Vb.net 搜索特殊字符(accute等)的变化时比较字符串,vb.net,string,comparison,Vb.net,String,Comparison,我想知道在.net中是否有一种方法可以比较字符串,当它们包含诸如之类的字母时 示例:我正在搜索一个表示José的字符串。当我检查字符串José是否包含“e”(不带acute)时,我希望返回true 有没有一种方法可以在不手动比较不同字符的所有变体的情况下实现这一点 有什么想法吗?此函数应将所有unicode E重音替换为普通的旧“E”。对于每个要“去重音”的字母,您都需要一个正则表达式。要比较没有口音,你需要说 If NormaliseAccents( string1 ) = Normalis

我想知道在.net中是否有一种方法可以比较字符串,当它们包含诸如之类的字母时

示例:我正在搜索一个表示José的字符串。当我检查字符串José是否包含“e”(不带acute)时,我希望返回true

有没有一种方法可以在不手动比较不同字符的所有变体的情况下实现这一点


有什么想法吗?

此函数应将所有unicode E重音替换为普通的旧“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代码。此外,这段代码完全没有经过测试:)

您首先必须以某种方式定义变音符号。不要列出所有字符;相反,请使用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。这将强制在逐个字符查看字符串之前,将所有组合字符(如
ee
分解为
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

同样,您可能会分别从每个字符串中删除特定类别的字符,只比较剩余的字符。

在比较之前,您需要制作某种替换映射并“规范化”字符串……是的,添加所有变体/删除它们是我试图避免的事,但我所有的探索都让我相信这是唯一的方法。