String.Formatの危険性(改) その4です。「[C#] ファイルからの入力の場合」からの続きです。
C# では"n"は書式文字列ではなく文字リテラルでした。というのが前回までの結論でした。
ところで、"n"などの記法は正規表現検索などでも使用しますが、こちらはどうなんでしょうか?ということで試してみました。
C#
using System; using System.Text.RegularExpressions; class Program { static void Main(string[] args) { String tab = "x09"; Console.WriteLine("1 :{0}", Regex.IsMatch(tab, "t")); // True Console.WriteLine("2 :{0}", Regex.IsMatch("t", tab)); // True Console.WriteLine("3a:{0}", Regex.IsMatch(tab , @"t")); // True Console.WriteLine("3b:{0}", Regex.IsMatch("t" , @"t")); // True Console.WriteLine("4 :{0}", Regex.IsMatch(@"t", @"t")); // False } }
VB
Imports System.Text.RegularExpressions Module Module1 Sub Main() Dim tab As String = Chr(&H9) Console.WriteLine("3a:{0}", Regex.IsMatch(tab, "t")) ' True Console.WriteLine("4 :{0}", Regex.IsMatch("t", tab)) ' False End Sub End Module
C#の1,2は表現は違いますが、検索対象(第一引数)、パターン文字列(第二引数)は等しく tab (0x09) で同じです。なので一致します(=True)。
C#の3a,3bは、検索対象(第一引数)は tab (0x09) ですが、パターン文字列(第二引数)は"t"です。が、"t"は正規表現言語要素なので、tab (0x09) と一致するものとして評価されるため一致します(=True)。
C#の4はパターン文字列(第二引数)の"t"はtab (0x09) と評価されるので、検索対象(第一引数)の"t"とは一致しません(=False)。
VBでは、検索対象(第一引数)の"t"は文字リテラルのエスケープとしては認められず、パターン文字列(第二引数)の"t"は tab (0x09) として評価されるので、4は一致しません(=False)。逆(3a)は一致します(=True)。
まとめると
・正規表現クラスが書式文字列として"n"とか"t"を解釈してくれる。
・だから、VBでも"n","t"のエスケープが有効。
・でも、C#ではその前に文字リテラルとしてエスケープされる。
・エスケープでなくても、文字コードそのものをパターン文字列に指定してもOK
ということのようです。
VBで"n"を使いたい場合やC#でもエスケープを外出しにしたい場合は、正規表現クラスを使えば実現できるって事ですね。
よねけん
フォローアップの続き物記事、お疲れ様です。拝読いたしました。
こういう記事はVBerがC#やるときの参考になってよいですね。
ところで、ソースコード例の後からまとめまでの文章中のnは
正しくはすべてtではないでしょうか。
Link | 2010年7月1日 00:26
オールトの雲
>参考になってよいですね。
ありがとうございます。
> ところで、ソースコード例の後からまとめまでの文章中のnは
ほ…ほんとうですね、直しておきます。_| ̄|○
Link | 2010年7月1日 01:29
[java] Unicodeのエスケープ #String.Formatの危険性(改) その5 | オールトの雲
[...] その5です。「 [VB.NET] 正規表現のエスケープ 」からの続きです。 [...]
Link | 2012年10月22日 22:38
[C#] ファイルからの入力の場合 # String.Formatの危険性(改) その3 | オールトの雲
[...] つづく [...]
Link | 2012年10月22日 22:39