3

.netに、éなどの文字が含まれている文字列を比較する方法があるかどうか疑問に思っています。

例:Joséという文字列を検索しています。文字列Joséに「e」が含まれているかどうかを確認するときにtrueを返したい(アキュートなし)

異なるキャラクターのすべてのバリエーションを手動で比較せずにこれを行う方法はありますか?

何か案は?

4

2 に答える 2

1

まず、発音区別符号を何らかの方法で定義する必要があります。すべての文字をリストしないでください。代わりに、Unicodeカテゴリを使用してください。考えるべき結合マークは2、3種類だけです。

たとえば、基本文字の幅に影響を与えない結合マーク(「非スペーシングマーク」)のみを検出したい場合があります。または、よりリベラルで、独立できないマークも含めることができますが、存在する場合はライン上である程度のスペースを占有します。インド語群の母音マークのように。3種類の結合マークはすべて、次のように検出されます。

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

この関数は、すべてのUnicodeEアクセントを単純な古い「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

このリンクは役に立つかもしれません。

正規表現には、10進数ではなく16進数で指定されたUnicodeコードが必要であることに注意してください。また、このコードは完全にテストされていません:)

于 2012-07-23T15:52:28.787 に答える