正規表現の改行の挙動に不具合No.18063
mizutori さん 04/09/27 01:38
 
■正規表現の改行の挙動に不具合
使用版:   秀丸 4.13 (正規表現ライブラリ HMJRE.DLL 1.12)
動作環境: Windows 2000 SP4

正規表現の改行の挙動に不具合があるようです。

例えば、「文字 < で始まらない行を xxx にする」という置換を実行します。
  検索欄:[^[^<].*$]
  置換欄:[xxx]

この正規表現を下記のサンプルテキストに適用すると、本当は333以外の行は
どの行もxxxになるはずですが、結果はそうはなりません。

-----[ sample.txt:適用前 ]---
111
222
<333>

444

555
---

-----[ sample.txt:適用後(期待した結果になりません) ]---
xxx
xxx
<333>
xxx444
xxx555
---

どうやら改行が不用意にマッチしてしまい、正しく実行されないようです。
そこで、検索欄を次のように書き直すと、期待通りの結果が得られます。
  検索欄:[^[^<\n].*$]

行頭 ^ と行末 $ の間には、改行 \n は本来出現しないはずなので、ちょっと
不思議な感じの正規表現ですが。

[ ]
RE:18063 正規表現の改行の挙動に不具合No.18064
ENCODINGSHIFTJIS さん 04/09/27 09:21
 
>行頭 ^ と行末 $ の間には、改行 \n は本来出現しないはず

ともいえない、複数行を置換の対象にもできますから
[^<]
は他のソフトでも ¥n にマッチします。
直感には 反しますが

[ ]
RE:18064 正規表現の改行の挙動に不具合No.18066
mizutori さん 04/09/27 10:44
 
>>行頭 ^ と行末 $ の間には、改行 \n は本来出現しないはず
>
>ともいえない、複数行を置換の対象にもできますから
>[^<]
>は他のソフトでも ¥n にマッチします。
>直感には 反しますが

正規表現について調べてみたら、最近(POSIX 1003.2)の規定では、
任意文字は改行(\n)にもマッチできる仕様であることがわかりました。
処理系やオプション指定によって実行状況は異なるようですが。

行頭や行末を含む正規表現は、特に改行を意識して注意深く書くこと、
という教訓を得ました。どうもありがとうございました。

[ ]