2008/03/16

複数個の改行を1つにまとめるファンクション

VBSで書いたソースで、末尾に改行2コくっついてしまた変数の改行を手軽に1つにしたいという依頼を受けました。

最終的にこんなふうになってしまった変数の中身を、

strData = strData & "10001:XXエラー" & vbCrlf
strData = strData & "10002:XXエラー" & vbCrlf
strData = strData & "10003:XXエラー" & vbCrlf
strData = strData & "10004:XXエラー" & vbCrlf
strData = strData & vbCrlf

こうしたい、

strData = strData & "10001:XXエラー" & vbCrlf
strData = strData & "10002:XXエラー" & vbCrlf
strData = strData & "10003:XXエラー" & vbCrlf
strData = strData & "10004:XXエラー" & vbCrlf

というわけですね…。

「strDataに入っているなら、Replace関数を使っちゃえば?」ということで、シンプルにこんな感じでひとまず完了。

strData = Replace(strData, vbCrlf & vbCrlf, vbCrlf)

しかしあまりにシンプルでつまらないので、正規表現だとどうなるのかなー、などと余計な好奇心。

「正規表現であれば、2コ改行以上の改行キーを1つにまとめることもできるなー」ということで、文末にくっついてしまった複数個の改行を1つにするファンクションを書いてみました。

Function ReplaceEnd( strData )
    '末尾の1コ以上の改行を1つにまとめる関数
    Dim objReg
    Set objReg = new RegExp
    objReg.Pattern = "(\r\n)+$"    '末尾の1個以上の改行
    ReplaceEnd = objReg.Replace(strData, vbCrlf)
    Set objReg = Nothing
End Function

MSDNのヘルプを見ると、\n:改行にマッチします。と出ているからVBSの改行はてっきり「\n」でいいんだ、と思っていたら、うまくいきませんでした。その原因は、strDataの中で、「vbCrlf」(キャリッジリーターン + ラインフィールド)を使っているからデス。

\r:キャリッジ リターンにマッチします。ということなので、「vbCrlf」は「\r\n」で表現すればいいわけなんですね…。

正規表現は正直なところ、冷や汗が出るほど苦手なんですが、ベンリだなー、とは認識しているので、今後とも用心深くコネタでちまちま実験していきたいです。

ついでに末尾に拘らず、2コ以上の改行を1つにまとめる関数を作成しました。EmEditorのマクロでも使えそうなネタですね。

Function ReplaceCrlfDel( strData )
    '2コ以上の改行を1つにまとめる関数
    Dim objReg
    Set objReg = new RegExp
    objReg.Global = True
    objReg.Pattern = "(\r\n)+"
    ReplaceCrlfDel = objReg.Replace(strData, vbCrlf)
    Set objReg = Nothing
End Function

0 件のコメント: