Dreamweaverの「検索および置換」で、開始タグから閉じタグまでが数行にまたがっているテキストを一気に書き換えたい。ところが普通に検索すると改行の手前で止まってしまい、思ったようにマッチしない――私も何度かこれで手が止まりました。
原因は、正規表現の「.(任意の1文字)」が既定では改行にマッチしないことにあります。この記事では、その壁を越えて複数行をまとめて置換するための書き方を、実際に動くパターンで整理しておきます。
関連リンク:これだけ覚えておけば捗る!Dreamweaverで置換する時に役立つ正規表現
なぜ普通の検索では改行をまたげないのか
正規表現は、特定のパターンに沿って文字列を検索・置換するための記号の組み合わせです。Dreamweaverの「検索および置換」でも、「正規表現を使用」にチェックを入れれば使えます。
つまずきやすいのが「.(ドット)」の扱いです。ドットは任意の1文字にマッチしますが、改行文字(\nや\r)にはマッチしません。だから <p>.*</p> のように書いても、開始タグと閉じタグが別々の行にあると途中で切れてしまいます。
そこで、改行を含めた「本当の任意の1文字」を表す書き方が必要になります。それが後述の [\s\S] です。
置換作業の前にバックアップを取ろう
正規表現による一括置換は強力なぶん、パターンを一文字書き間違えただけで大量のファイルを壊すこともあります。特にサイト全体を対象にする置換は、実行前に必ずバックアップを取っておくのが安全です。私は「検索および置換」で対象を広げる前に、必ずコピーを別フォルダーに残すようにしています。
複数行にマッチさせる基本パターン
改行をまたいで文字列をまとめて拾うときに使うのが、次のパターンです。
([\s\S]*?)
\s(空白・タブ・改行)と \S(空白以外のすべて)を角括弧でまとめると、「空白か、空白以外か」=改行を含むあらゆる1文字を表せます。これを繰り返すことで、行をまたいだ範囲を丸ごとキャプチャできるわけです。
置換を実行する前に、ダイアログの「正規表現を使用」にチェックが入っているか必ず確認してください。ここが外れていると、記号がそのままの文字として検索されてしまいます。
正規表現の各要素の意味
上のパターンを分解すると、それぞれの記号はこういう役割です。
- \s:半角スペース、タブ、改行などの空白文字にマッチします。
- \S:空白以外の任意の1文字にマッチします。
- [ ]:角括弧内のいずれかにマッチする文字クラス。
[\s\S]で「空白か空白以外」=すべての文字を表します。 - *:直前の要素の0回以上の繰り返し。
- ?:直前の量指定子を最短一致(貪欲でない)にします。
*?とすることで、条件に合う最も短い範囲で止まります。 - ( ):丸括弧で囲んだ部分をキャプチャグループとして記憶し、置換側で
$1のように再利用できます。
見落としやすいのが * と *? の違いです。*(貪欲)だと、最初の開始タグから最後の閉じタグまでを一気に飲み込んでしまい、間にある複数のブロックがひとまとめになってしまいます。*?(最短一致)にすれば、それぞれのブロックを個別に拾えます。複数行置換ではほぼ *? を使う、と覚えておくと事故が減ります。
具体例:改行をまたいだタグの一括置換
例えば、こんなふうに開始タグと閉じタグが別の行に分かれた見出しを、まとめて置き換えたいとします。
<h1>
ページタイトル
</h1>
検索欄に次のように入力します。*?で最短一致にしているので、複数の見出しがあっても1つずつ正しくマッチします。
<h1>([\s\S]*?)</h1>
置換欄には次のように入力します。$1は、丸括弧でキャプチャした「タグの中身」をそのまま差し込むための指定です。
<h2>$1</h2>
こうすると、中身(改行や前後の空白も含む)はそのまま残したまま、外側の h1 だけを h2 に付け替えられます。属性つきのタグまで拾いたいときは <h1[^>]*>([\s\S]*?)</h1> のように開始タグ側を広げておくと安全です。
この書き方が効く場面
改行をまたぐ [\s\S]*? の組み合わせは、次のような編集で特に役立ちます。
- 複数ファイルをまたいだ置換:「検索および置換」の対象を「フォルダー全体」やサイト単位に広げれば、同じパターンを一括処理できます。
- ブロック単位の書き換え:数行にわたるタグや定型のマークアップを、中身を保ったまま入れ替えられます。
- 手作業の削減:1ファイルずつ開いて直す手間が、数クリックで済みます。
私の場合、古い記事のタグ構造をまとめて整えるときに、この書き方でだいぶ時間を節約できました。
注意点:最短一致と貪欲一致を取り違えない
一番やらかしやすいのが、? を付け忘れて貪欲一致のまま実行してしまうことです。想定より広い範囲が一気に置き換わり、間の要素まで巻き込まれます。
実行前に「すべて検索」でマッチ範囲をプレビューし、意図した箇所だけが選ばれているかを確かめてから置換する。テスト用のファイルで一度試してから本番に適用する。この二段構えにしておくと、取り返しのつかない置換を避けられます。
まとめ
Dreamweaverで複数行をまたいで置換したいときは、次の3点を押さえておけば大きく外しません。
- 改行にマッチしない
.の代わりに[\s\S]を使う。 - 範囲を1ブロックずつ拾うため、量指定子は
*?(最短一致)にする。 - 中身を残して外側だけ変えるなら、
( )でキャプチャして置換側で$1を使う。
あとは「正規表現を使用」のチェックと、実行前のバックアップとプレビュー。ここまでそろえば、行をまたいだ面倒な置換もこわがらずに進められます。