CrLf
から Lf
になってしまう問題があります。これは行末 "$"
までの置換を行った場合に起こる。例えば、SQLのコメントを全て削るような置換パターンで発生する。
RegExp.Pattern = "--.+$"
RegExp.Replace(SQL, "")
このとき、実際は改行コード
Cr
まで含めた置換になっており、問題が発生します。(置換前)
ColName -- コメントCrLf
※赤字が置換される部分(置換後)
ColName Lf
改行コード
CrLf
のうち、Cr
が置換され消えてしまい Lf
だけが残るので、改行コード CrLf
が Lf
に変換されたように感じられます。.+
(ドット プラス)や .*
(ドット アアスタリスク)などの任意の文字の繰り返しパターンが問題になる。ドットは「改行文字を含まない任意の 1 文字」を表すので、リファレンスによれば、どうやら仕様通りとも言えるのだが・・・$
: 入力文字列の末尾と一致します。RegExp オブジェクトの Multiline プロパティが設定されている場合、$
は'\n'
または'\r'
の直前にも一致します。
→ つまり、'\n'
の直前の'\r'
は一致してしまうのね。.
(ドット) : 改行文字"\n"
を除く任意の 1 文字に一致します。
→ つまり、キャリッジ リターン"\r"
は除いていないのね。
いやいや!この仕様は無理がある。
ドットでない特定のパターンの繰り返しならば、改行コードが削られることは無い。
例えば、行末のスペースとタブのゴミを削るパターン
RegExp.Pattern = "( |\t)+$"
RegExp.Replace(SQL, "")
検証用のサンプルロジック
Const Sample As String = _ "abc -- コメント" & vbCrLf & _ "def" & vbCrLf & _ "ghi" Dim Reg As New RegExp Reg.Global = True Reg.MultiLine = True Reg.Pattern = "--.+$" Dim Text As String Text = Reg.Replace(Sample, "") For i = 1 To Len(Text) Debug.Print Mid(Text, i, 1) & vbTab & Asc(Mid(Text, i, 1)) Next
■ 参考資料
正規表現の構文http://msdn.microsoft.com/ja-jp/library/cc392020.aspx