[VB.NET] 正規表現のエスケープ # String.Formatの危険性(改) その4

2010年6月30日

 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#でもエスケープを外出しにしたい場合は、正規表現クラスを使えば実現できるって事ですね。

 つづく






カテゴリー: C#, Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

4 Comments to "[VB.NET] 正規表現のエスケープ # String.Formatの危険性(改) その4"

  1. よねけん

    フォローアップの続き物記事、お疲れ様です。拝読いたしました。
    こういう記事はVBerがC#やるときの参考になってよいですね。

    ところで、ソースコード例の後からまとめまでの文章中のnは
    正しくはすべてtではないでしょうか。

  2. オールトの雲

    >参考になってよいですね。
     ありがとうございます。

    > ところで、ソースコード例の後からまとめまでの文章中のnは
     ほ…ほんとうですね、直しておきます。_| ̄|○
     

  3. [java] Unicodeのエスケープ #String.Formatの危険性(改) その5 | オールトの雲

    [...] その5です。「 [VB.NET] 正規表現のエスケープ 」からの続きです。 [...]

  4. [C#] ファイルからの入力の場合 # String.Formatの危険性(改) その3 | オールトの雲

    [...]  つづく [...]

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org