2008/03/16

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

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

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

  1. strData = strData & "10001:XXエラー" & vbCrlf  
  2. strData = strData & "10002:XXエラー" & vbCrlf  
  3. strData = strData & "10003:XXエラー" & vbCrlf  
  4. strData = strData & "10004:XXエラー" & vbCrlf  
  5. strData = strData & vbCrlf  

こうしたい、

  1. strData = strData & "10001:XXエラー" & vbCrlf  
  2. strData = strData & "10002:XXエラー" & vbCrlf  
  3. strData = strData & "10003:XXエラー" & vbCrlf  
  4. strData = strData & "10004:XXエラー" & vbCrlf  

というわけですね…。

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

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

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

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

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

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

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

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

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

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

0 件のコメント: