.netに、éなどの文字が含まれている文字列を比較する方法があるかどうか疑問に思っています。
例:Joséという文字列を検索しています。文字列Joséに「e」が含まれているかどうかを確認するときにtrueを返したい(アキュートなし)
異なるキャラクターのすべてのバリエーションを手動で比較せずにこれを行う方法はありますか?
何か案は?
.netに、éなどの文字が含まれている文字列を比較する方法があるかどうか疑問に思っています。
例:Joséという文字列を検索しています。文字列Joséに「e」が含まれているかどうかを確認するときにtrueを返したい(アキュートなし)
異なるキャラクターのすべてのバリエーションを手動で比較せずにこれを行う方法はありますか?
何か案は?
まず、発音区別符号を何らかの方法で定義する必要があります。すべての文字をリストしないでください。代わりに、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
同様に、各文字列から特定のカテゴリの文字を個別に削除し、残っているものだけを比較することもできます。
この関数は、すべての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コードが必要であることに注意してください。また、このコードは完全にテストされていません:)