[リストへもどる]
一括表示
タイトル正規表現による改行コードを含む複数行の検索及びgrepについて
記事No3527
投稿日: 2006/04/23(Sun) 15:53
投稿者CCC
はじめまして。K2Grepを愛用させて頂いているCCCと申します。
K2Grepは秀丸やサクラエディタ等のテキストエディタではできない
「grep結果に改行コードを含む複数行を表示させる」機能があるため、
大変重宝しております。

ここで質問なのですが、次のような4行を含むテキストファイルがあります。

select cat,
dog ,
tiger
from animal

このテキストファイルに対して、
正規表現「select.*\r\n.*\r\n.*\r\n.*from」で検索やgrepを行うとselectからfromまでがヒットされますが、
正規表現「select(.*\r\n)*.*from」や「select(.*\r\n){1,3}.*from」の条件では、ヒットしません。

検索条件に改行コード「\n」を含んでいる場合は、
直前の文字の数量子のメタ文字は使えないのでしょうか?

P.S.上記4行のテキストファイルはCR+LF想定ですが、
上記ファイルをLF改行で作成した場合、
正規表現「select.*\r\n.*\r\n.*\r\n.*from」の条件では、検索ではヒットしませんが、grepの場合はヒットします。
検索とgrepでは検索のアルゴリズムに違いがあるのでしょうか?

タイトルRe: 正規表現による改行コードを含む複数行の検索及びgrepについて
記事No3528
投稿日: 2006/04/24(Mon) 09:39
投稿者K2
 K2です。

 検索についてのヘルプを見て頂きたいのですが、
検索機構の問題で、改行コードについてはいくつかの制約が
あります。

 まず、例文で出されている\rは使用できません。それではマッチ
しないはずなので、例文が間違っていると推測します。実際には
\rは使用されていないのではないでしょうか。

 次に、K2Editorは、検索高速化のために、検索エンジンに検索
対象文字列の一部しか渡しません。この一部がどこまでかを決める
判定基準に、検索文字列の\nの数を使用しています。そのため、
\nに対する閉包・開包を使用してしまうと、検索対象文字列
の行数が実際に足りなくなる可能性があります。

 これに対して、全置換時には、検索エンジンにすべての
検索対象文字列を渡します。検索エンジンは、当然\nの
閉包・開包にも対応していますから、正確な検索ができます。
つまり全置換時だけ検索アルゴリズムが違います。

 ご指摘のgrep時のLF改行ファイルで違う結果になるという
現象は、こちらでは確認できませんでした。ソースを確認して
みましたが、特にそういう現象になる原因を発見することは
できませんでした。

 以上、よろしくお願いします。