\nを使った複数行検索の際の制限について(Ver9.35対応版)
目次−
コマンド−
検索系コマンド−
正規表現−
\nを使った複数行検索の際の制限について
秀丸エディタでは、検索文字列に\nを含めて正規表現を使うことにより、複数行にまたがる文字列を検索することができます。
例えば、「これは\n秀丸エディタです$」という検索文字列を指定すれば、
これは
秀丸エディタです
という2行を見つけだすことができます。
秀丸エディタでは検索元文字列の中に「\n」と改行コードがいくつ含まれているかを計算し、その数+1の行まで検索でヒット可能にします。そういう特殊な仕組みのため、\n自体を任意の回数繰り返すような正規表現は、期待通りに動作しないことがあります。
例えば、「\n+」という正規表現は、秀丸エディタでは\nが1つ含まれているものと解釈し、2行単位で検索処理します。したがって、空行が3行連続していても、そのうちの2行分にしかヒットしません。ご注意ください。
(V8.00以降では(?#maxlines:数値)という記述を書くことで回避可能)
また、\nを使った検索は秀丸エディタに負荷がかかって遅くなるので、もし「$」で置き換え可能な場合にはなるべく「$」を使うようにしてください。
ちなみに、強調表示で指定する文字列の中には\nは使えません。(強調表示は複数行に対応してません)
検索にヒットした状態は、[その他]→[動作環境]→[
検索]で、「検索での表示」を範囲選択にしておくと、複数行に渡ってヒットしている状態がわかります。
タグ付き正規表現などで、改行以降にヒットするような検索文字列の場合はヒットしないようになっています。
例えば、「(これは)\n(秀丸エディタです)(?\2)」という検索文字列の場合、
これは
秀丸エディタです
という2行のうち2行目にヒットすることが期待されますが、実際にはヒットしないように抑制されています。
(V8.00以降では(?#fulllinematch)という記述を書くことで回避可能)
V8.00以降
V8.00以降では、検索文字列内にコメントを書くことでこれらの制限を取り払うことができるようになりました。
このコメントによる制御は正規表現DLLの解釈ではなくて秀丸エディタ本体による独自の解釈で、正規表現の文法には含まれません。
- (?#maxlines:数値)
-
検索文字列に「(?#maxlines:数値)」というような記述が含まれていると、指定された数値の行数までをバッファに取り込んで検索します。
例えば、「(?#maxlines:10)\n+」という検索文字列の場合、連続した改行10個までを検索できます。
指定可能な値は9999までの上限があります。(V8.96以降は9999で、V8.96未満は255でした)
- (?#fulllinematch)
-
検索文字列に「(?#fulllinematch)」という記述が含まれていると、2行目以降にのみヒットするようなパターンの抑制が解除されます。
ただし、上下検索で同じ結果が得られない場合が出てくるので注意が必要です。
不都合の出る例その1:
検索文字列「(?#fulllinematch)(a)\n(a)(?\2)」で、
a
a
a
a
a
というテキストで上下検索の結果が違うようになります。
不都合の出る例その2:
検索文字列「(?#fulllinematch)aaa\nb*」で、
xxx
aaa
bbb
というテキストで最初の検索では上2行だけが対象となり、bbbの行がマッチしなくなります。