VBScriptの正規表現における改行(LF)

VBScriptの正規表現エンジン(RegExpオブジェクト)のドットメタ文字(.)は、改行(ラインフィード、vbLf)にはマッチしない。MultiLineプロパティにTrueを指定しても同じ。知ってる人には当たり前の話なんでしょうけど、なつきは「MultiLine=複数行処理」を誤解してハマったので。MultiLineプロパティをTrueにすると、文字列の先頭(^)、末尾($)がそれぞれ改行(LF)の直後、直前にマッチするようになる。それだけ。

Sub regTest_VBS()

    Dim reg, teststr
    Set reg = CreateObject("VBScript.RegExp")
    teststr = "ABC" & vbCrLf & "DEF"
    
    reg.Pattern = "^D" '// 行頭のD
    
    reg.MultiLine = False
    MsgBox reg.Test(teststr) '// False
    reg.MultiLine = True
    MsgBox reg.Test(teststr) '// True
    
    reg.Pattern = "C.*?D" '// 複数行にまたがる文字列
    
    reg.MultiLine = False
    MsgBox reg.Test(teststr) '// False
    reg.MultiLine = True
    MsgBox reg.Test(teststr) '// False
    
    Set reg = Nothing

End Sub

PHPの正規表現(Perl互換)なら、s修飾子を使うことでドットメタ文字に改行(\n)を含めることができる。RegExpオブジェクトにはこれに当たるものがないので、ドット(.)の代わりにキャラクタクラス([\n.]とか)を使うしかないんですかねえ。ちなみにPHPでもm修飾子(multiline)ではドットメタ文字は改行を含むようにはなりません

  $teststr = "ABC\r\nDEF";
  
  print preg_match("/C.*?D/", $teststr)."\r\n"; // 0
  print preg_match("/C.*?D/m", $teststr)."\r\n"; // 0
  print preg_match("/C.*?D/s", $teststr)."\r\n"; // 1

なお、Windows環境だと「改行」がCR+LF(キャリッジリターン+ラインフィード、vbCrLf)の意味で使われることがあってまぎらわしいけど、CR(キャリッジリターン、vbCr)はドットメタ文字に常にマッチする。ドットメタ文字はあくまでLF以外の任意の1文字という扱い。

Sub regTest_VBS_2()

    Dim reg, teststr
    Set reg = CreateObject("VBScript.RegExp")
    teststr = "ABC" & vbCr & "DEF"
    
    reg.Pattern = "C.D"
    
    MsgBox reg.Test(teststr) '// True
    
    Set reg = Nothing

End Sub

関連(してるかもしれない)記事たち

WordPressへCSV形式で記事を移行
4年ぶり?にサイトリニューアルしました。PHPによる独自システムからWordPressベースに変更。デザインそのものはほ...
IPアドレスでコメントブロック
中国からの政治的な中傷コメントがたびたび見かけられるので、ちょっと対策。中国のホストの大半が逆引きできない(IPアドレス...
wptouch-mobile
アップデートに負けないWPtouchカスタマイズ
カスタマイズした内容がアップデート適用で消える WPtouch Moblie Plugin(以下WPtouch) は自分...

「VBScriptの正規表現における改行(LF)」への2件のフィードバック

  1. Interesting. I usually make sure my strings have been converted from \r\n to \n before any string processing is done to avoid problems like these. For example, text mode i/o under Windows automatically convert \r\n in the file to \n. This way the regular expression in vbscript and php can be the same.

  2. DPさん:
    なるほど。ちょっと違いますけどさっそく別のコードで使わせていただきました。つまりRegExpを通す前に文字列中のLFをブランクにReplaceして、処理後にCRをCRLFに戻す。

コメントは停止中です。