RegexOptions.CultureInvariantを用いると、文字の比較にインバリアントカルチャを用いた比較を行うようにすることができます。
次の例では、正規表現を使って単語がiで始まるかどうかを調べています。 比較の際、インラインオプション(?i:)
により、大文字小文字の違いは無視されます。
RegexOptions.CultureInvariantを指定してインバリアントカルチャによる比較を行う
Imports System
Imports System.Globalization
Imports System.Text.RegularExpressions
Imports System.Threading
Class Sample
Shared Sub Main()
Dim text As String = "Internet"
Dim pattern As String = "(?i:i(\w+))"
' 現在のカルチャを表示
Console.WriteLine(Thread.CurrentThread.CurrentCulture)
' RegexOptions.CultureInvariantを指定した場合とそうでない場合で結果を比較
Console.WriteLine(Regex.IsMatch(text, pattern))
Console.WriteLine(Regex.IsMatch(text, pattern, RegexOptions.CultureInvariant))
Console.WriteLine()
' 現在のカルチャを"tr-TR"に変更
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-TR")
Console.WriteLine(Thread.CurrentThread.CurrentCulture)
' RegexOptions.CultureInvariantを指定した場合とそうでない場合で結果を比較
Console.WriteLine(Regex.IsMatch(text, pattern))
Console.WriteLine(Regex.IsMatch(text, pattern, RegexOptions.CultureInvariant))
Console.WriteLine()
End Sub
End Class
実行結果
ja-JP True True tr-TR False True
この例での入力文字列"Internet"
はiで始まる単語のため、カルチャがja-JPの場合はRegexOptions.CultureInvariantを指定しているかどうかに関わらず正規表現にマッチします。 しかしカルチャをtr-TR(トルコ語/トルコ)に変更すると、RegexOptions.CultureInvariantを指定しないとマッチしません。
トルコ語においてはiとIが大文字小文字の関係ではなく異なる文字として扱われるため、正規表現には一致しなくなります(参考、Internetのトルコ語表記: İnternet)。 この例のように、カルチャによって異なる結果とならないようにするには、RegexOptions.CultureInvariantを指定する必要があります。
カルチャによる動作・結果の違いについてはカルチャによる動作の違いとインバリアントカルチャ、またカルチャそのものについてはカルチャの基本・種類・カルチャ情報の取得で解説しています。
RegexOptions.CultureInvariantの動作に関しては文字列と比較オプション・カルチャの並べ替え規則 §.StringComparison列挙型も合わせて参照してください。