2012-07-23 57 views
3

我想知道在.net中是否有方法来比较字符串,如果它们包含字母,如é。当搜索特殊字符(accute等)的变化时比较字符串

例如:我正在搜索一个字符串,说何塞。当我检查字符串José是否包含“e”(不含增值)时,我想返回true。

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

有什么想法?

+0

您需要制作某种替换图并在比较之前“正常化”字符串... – 2012-07-23 15:33:40

回答

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 

以类似的方式,您可以分开剥离每个字符串中特定类别的字符,并只比较剩余的字符。

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码,不是小数。此外,此代码完全未经测试:)

+0

他仍然必须手动检查所有变化... – Pacane 2012-07-23 16:18:26

+0

是的,添加所有变化/剥离它们是我我试图避免,但是我所有的搜索都让我相信这是唯一的方法。 – Eric 2012-07-23 16:29:39