はじめに — チェックボックス1個で、手作業が消える
ログを1万行もらった。全角スペースが混ざった CSV が届いた。納品前に行末の空白を落としたい。
こういう仕事は、置換ダイアログにある「正規表現」のチェックボックスをオンにするかどうかで、30分の手作業と5秒の一撃に分かれます。サクラエディタはこの機能を昔から持っていて、しかも v2.4.0.0 以降は正規表現ライブラリが配布物に同梱されるようになりました。「サクラエディタで正規表現を使うには DLL を別途入手する」と言われていた時代は、もう終わっています。
そしてもうひとつ、ネット上の情報がいちばん錯綜しているのがここです。サクラエディタの正規表現は「Perl と同じ」ではありません。 中身は独立した正規表現ライブラリで、どの版が入っているかによって使える記法が変わります。この記事は、v2.4.3 に実際に同梱されている版を特定したうえで、その版の公式ドキュメントに当たりながら書いています。
📝 この記事でわかること:
- 「正規表現」チェックボックスの場所と、正規表現ライブラリの正体(bregonig.dll 4.20)
- 最初に覚える3つ — 空行削除/行末の空白除去/タブとスペースの変換
- グループと後方参照 — CSV の列入れ替え・日付フォーマットの変換
- 改行をまたぐ置換はどこまでできるのか(ここが一番誤解されている)
- Grep 置換で複数ファイルを一括置換する、その前に知っておく危険
- 貪欲マッチ・全角数字・文字コード混在という定番の失敗
すぐ手を動かしたい方は → ⚙️ まず「正規表現」をオンにする
🔍 正規表現とは — 「その文字列」ではなく「文字列の形」で探す
通常の検索は、探したい文字列そのものを打ち込みます。ERROR と入れれば ERROR が見つかる。当たり前です。
正規表現は、そこを一段抽象化します。探すのは文字列ではなく、文字列の「形」 です。
[0-9]{4}/[0-9]{2}/[0-9]{2}
この1行は「数字4桁・スラッシュ・数字2桁・スラッシュ・数字2桁」という形を表していて、2026/09/08 にも 1999/01/01 にもマッチします。日付が何万通りあっても、形はひとつです。
文字列のパターンを、記号を使って1行で表す記法。. は任意の1文字、* は直前の繰り返し、[] は文字の集合、() はグループ、というように、普通の文字と特別な意味を持つ記号(メタ文字)を混ぜて書きます。
エディタ・grep・プログラミング言語・ログ検索基盤まで、テキストを扱う道具のほとんどが何らかの正規表現を積んでいます。ただし方言があり、道具ごとに使える記法が違う ——この記事の中心テーマもそこです。
検索でこれができると便利ですが、本当に効いてくるのは 置換 のほうです。「形」で捕まえたものを、部分ごとに並べ替えて書き戻せる。手作業なら1行ずつやることが、ファイル全体に一度で適用できます。
🧩 その正規表現は何で動いているのか — bregonig.dll 4.20 という答え
記法の話に入る前に、足元の確認を1回だけやっておきます。ここを飛ばすと、ネットで拾った書き方が動かない理由が永久に分からなくなるためです。
サクラエディタは正規表現の処理を自前で書いていません。外部の 正規表現ライブラリ(DLL)に投げています。公式ヘルプの「正規表現ライブラリ」の項には、こう書かれています。
検索条件などに正規表現を利用するには、正規表現機能を提供するライブラリをインストールする必要があります。 (中略)bregonig.dll / 正規表現エンジンに鬼車を使用した BREGEXP.DLL 互換の正規表現ライブラリです。 ※パッケージ版に同梱されています
つまり積み木は3段になっています。
v2.4.3"] --> B["bregonig.dll
Ver.4.20"] B --> O["Onigmo 6.2.0
正規表現エンジン"]
実際に v2.4.3 のインストール先(C:\Program Files (x86)\sakura\)を覗くと、sakura.exe と並んで bregonig.dll が置かれています。
| ファイル | バージョン |
|---|---|
sakura.exe |
2.4.3.7173 |
bregonig.dll |
4.20 |
ただ、これを確かめるのにエクスプローラでファイルのプロパティを開く必要はありません。サクラエディタは、自分が掴んでいる正規表現ライブラリの名前と版を、ダイアログの中に表示しています。
- 置換ダイアログ — 「正規表現」チェックボックスのすぐ下
- 共通設定 →『検索』プロパティ
- Grep 置換ダイアログ
この3箇所すべてに、同じ1行が出ます。
bregonig.dll Ver.4.20 with Onigmo 6.2.0
さらに Grep を実行すると、結果ウィンドウの検索条件の見出しにも同じ文字列が入ります。こちらはテキストなのでコピーできます。
(正規表現:bregonig.dll Ver.4.20 with Onigmo 6.2.0)
DLL の名前・その版・中のエンジンとその版が、1行にまとめて出ている。 自分の環境が何で動いているのかは、置換ダイアログを開いた瞬間に分かるようになっています。この記事の記述と手元が食い違ったら、まずここを見比べてください。
そして bregonig.dll 4.20 の公式ドキュメント(2019年1月30日更新)の更新履歴には、こう書かれています。
2019/01/30 Ver.4.20 — Onigmo (Oniguruma-mod) 6.2.0 for bregonig.dll を使用。(Unicode データの更新: Unicode 11.0.0, Emoji 11.0)
鬼車(Oniguruma)を改良した 鬼雲(Onigmo) が最下段のエンジンです。Ruby の正規表現エンジンと同じ系譜、と言えばピンとくる方も多いはずです。
「Perl 互換」という説明の、正しい距離感
bregonig.dll のドキュメントは、各メジャーバージョンの位置づけをこう書いています。
| bregonig の版 | 位置づけ |
|---|---|
| Ver.1.xx | Perl 5.8 互換(Shift_JIS 専用・開発終了) |
| Ver.2.0x | Perl 5.10 互換(UTF-16LE 対応・開発終了) |
| Ver.3.0x, Ver.4.xx | Perl 5.14 互換(UTF-8 対応 API 追加・x64 対応) |
「Perl 5.14 互換」とうたわれてはいるものの、これは互換をめざした別実装であって、Perl そのものではありません。ドキュメントには「Perl とは異なり」で始まる注意書きが何度も出てきます。たとえば $var のような変数展開は行われずただの文字列として扱われる、$` や $' は使えない、${${1}} のような入れ子の参照には対応していない、といった具合です。
一方で、素の Perl より広い部分もあります。戻り読み (?<=式)、原子的式集合 (?>式)、POSIX ブラケット [:ascii:]、名前付きグループ (?<name>式) ——このあたりは Onigmo 由来の機能です。
だから正しい構えは「Perl と同じ」でも「Perl の劣化版」でもなく、Onigmo という別系譜のエンジンが、Perl 風の顔をして動いている、です。
ネットの記述と、v2.4.3 の実際
サクラエディタは四半世紀ものあいだ使われてきたソフトなので、検索して出てくる情報も四半世紀ぶんの地層になっています。特に BREGEXP.DLL 時代(bregonig 以前)の記述 が今も大量に残っていて、これが噛み合わない原因になります。
| よく見かける記述 | v2.4.3 での実際 |
|---|---|
| 正規表現を使うには DLL を別途入手して置く | 2.4.0.0 以降は配布物に同梱(公式ヘルプの Grep 置換の項に明記) |
\w は半角英数字とアンダースコアだけ |
bregonig では 2バイト文字(漢字など)も含む。\W \b \B の挙動もこれに追随する |
戻り読み (?<=…) は使えない |
bregonig では 使える(Onigmo 由来) |
\d は半角数字だけ |
Unicode 版では全角数字も含む(公式ヘルプの表に明記) |
文字クラスの中の [ はそのまま書ける |
bregonig では \[ とエスケープが必要(Ver.1.30 以降の仕様変更)。しかも [[] はエラーにならず、黙って何にもマッチしない |
「BREGEXP.DLL をダウンロードして sakura.exe と同じフォルダに置く」と書いてある記事は、bregonig 以前の世代 です。記法の説明も当時のものなので、そのまま持ってくると噛み合いません。2.4.0.0 より前の話かどうかで、いったん切り分けてください。
⚙️ まず「正規表現」をオンにする
前置きが長くなりました。手を動かします。
サクラエディタの正規表現は、検索・置換・Grep・Grep 置換の各ダイアログにある「正規表現」チェックボックス で有効になります。オフのままだと [0-9] は「かぎ括弧と数字とハイフンという文字そのもの」として検索されるので、思ったとおりに動かないときは、まずここを疑ってください。
置換ダイアログ。「正規表現」のすぐ下に、いま使われている正規表現ライブラリの版が出ている
置換ダイアログには、正規表現とセットで覚えておきたいオプションがもうひとつあります。「すべて置換」は置換の繰返し です。公式ヘルプはこのオプションの効き方を、次の例で説明しています。
(例)「ababab」に対して「^ab」を「」に置換すると 有効時:「ababab」が削除されます。 無効時:行頭の「ab」だけが削除されます。
^(行頭)や \b(単語境界)のような 位置を指定するパターンで削除する ときだけ、結果が変わります。ふだんは意識しなくても構いませんが、「行頭のインデントだけ落としたつもりが行全体が消えた」ときは、まずこのチェックを見てください。
なお、正規表現ライブラリを差し替えたい場合は 共通設定 → 『検索』プロパティ → 正規表現ライブラリ指定 で任意のパスを指定できます。公式ヘルプは「通常は設定不要です」とし、指定が無い場合は bregonig.dll → bregexp.dll の優先順で自動検索するとしています。ここを触るのは、複数バージョンを比べたいときくらいです。
共通設定 →『検索』プロパティ。ライブラリのパスを指定する欄と、実際に読み込まれている版
✂️ 最初の3つ — 空行削除・行末の空白・タブとスペース
正規表現置換の入口として、実務でそのまま使える3つを挙げます。どれも1行の中で完結するので、いちばん安全な部類です。
① 空行を削除する
| 入力するもの | |
|---|---|
| 置換前 | ^\r\n |
| 置換後 | (空欄) |
公式ヘルプの「利用可能な正規表現」には、改行の扱いがはっきり書かれています。
サクラエディタで改行(CRLF)を検索する場合は、
\r\nで検索して下さい。 改行(CR,LF,CRLFのすべて)を検索する場合は、[\r\n]+のように指定してください。
Windows で作られたテキストは基本的に CRLF ですが、Linux で作られたファイルや他システムからの出力が混ざると LF だけのこともあります。改行コードが混在しているかもしれないファイル なら、^[\r\n]+ のほうが取りこぼしがありません。
② 行末の空白を落とす
| 入力するもの | |
|---|---|
| 置換前 | [ \t]+$ |
| 置換後 | (空欄) |
半角スペースとタブが1個以上、行末($)まで続いている箇所を消します。差分が空白だけで汚れる問題や、YAML の末尾空白といった、地味に効くやつです。
全角スペースも一緒に落としたいなら、文字クラスの中に全角スペースそのものを1文字書き足します([ \t ]+$)。見た目で区別がつかないので、書いたあとに小さいファイルで1回試してから全体に当ててください。
なお \s は全角スペースにもマッチするので(後述の文字種の表)、\s+$ でも届きます。ただし \s は改行類も含む広い集合なので、行末処理では 何を消すつもりなのかが読み返して分かる [ \t ]+$ のほうを基本にしておくと安全です。
③ タブとスペースを相互に変換する
これは 正規表現を使わないほうが早い ケースです。サクラエディタには専用のコマンドがあります。
| コマンド | 動作(公式ヘルプより) |
|---|---|
| TAB→空白 | 選択範囲の TAB を、現在の TAB 幅(タイプ別設定『スクリーン』)を考慮して必要な数の半角空白に置換 |
| 空白→TAB | 選択範囲の半角空白を、TAB 幅を考慮して TAB に置換。単語の区切りなど、単独のスペースは変換されない |
正規表現で \t を半角スペース4個に置換すると、TAB 幅の考慮が抜けます。タブは「4文字ぶん」ではなく「次のタブ位置まで」なので、行の途中にあるタブを一律4スペースにすると桁がずれる。専用コマンドはそこを見てくれます。
正規表現はなんでもできますが、エディタが専用機能として持っているものは、そちらのほうが正確 です。TAB 幅のような「エディタしか知らない情報」が絡む変換は特にそうです。正規表現は、専用機能が無い形の変換にとっておきましょう。
🧷 グループと後方参照 — 捕まえて、並べ替える
ここからが正規表現置換の本番です。
( ) で囲った部分は グループ として記憶され、置換後の文字列から番号で呼び出せます。これを 後方参照 と呼びます。「消す」「揃える」から「並べ替える」に進む道具です。
検索側と置換側で、書き方が違う
ここが最初の関門です。公式ヘルプの表を整理すると、こうなります。
| 用途 | 書き方 | 補足 |
|---|---|---|
| 検索文字列の中で参照 | \1 \2 … |
同じ文字列がもう一度出る箇所を探すときに使う |
| 置換後の文字列で参照 | $1 $2 … |
サクラエディタでは \1 も使える |
| 置換後・数字が続くとき | ${1} |
$12 が「12番目」と解釈されるのを防ぐ |
| マッチ全体 | $& |
グループを作らずに全体を包める |
${n} は覚えておくと救われます。bregonig のドキュメントはこの記法が追加された理由を、s/(hoge.)/${1}2/g のように「番号指定参照の後に続けて数字を書くことが可能になります」と説明しています。
CSV の列を入れ替える
名前,部署,社員番号 を 社員番号,名前,部署 に組み替えます。
| 入力するもの | |
|---|---|
| 置換前 | ^([^,]+),([^,]+),([^,]+)$ |
| 置換後 | $3,$1,$2 |
置換前 置換後
田中,開発部,1042 → 1042,田中,開発部
佐藤,品質保証,1157 → 1157,佐藤,品質保証
[^,]+ は「カンマ以外が1文字以上」。ここを .+ にしないのが要点です(理由は後述の「貪欲マッチ」で説明します)。
日付のフォーマットを変換する
2026/09/08 を 2026-09-08 に。
| 入力するもの | |
|---|---|
| 置換前 | ([0-9]{4})/([0-9]{1,2})/([0-9]{1,2}) |
| 置換後 | $1-$2-$3 |
日本語の日付表記から ISO 形式へ寄せたいときも、同じ形で書けます。
| 入力するもの | |
|---|---|
| 置換前 | ([0-9]{4})年([0-9]{1,2})月([0-9]{1,2})日 |
| 置換後 | $1-$2-$3 |
番号が増えて分からなくなったら、(?<year>[0-9]{4}) のように名前を付けられます。置換側からは $+{year} で参照します(公式ヘルプが「Perl 5.10 互換、推奨」としている書き方)。
${name} という書き方も通りますが、bregonig のドキュメント自身が「独自拡張、暫定仕様のため非推奨」と書いています。長く残すマクロに使う記法ではありません。
↩️ 改行をまたぐ置換 — どこまでできるのか
検索して出てくる情報がいちばん食い違うのがここです。公式ヘルプの記述を先に置きます。
「検索」ダイアログの解説には、こう書かれています。
二行以上(複数行)にまたがった検索は、今のところできません。
さらに「利用可能な正規表現」の末尾、サクラエディタが正規表現ライブラリへ渡している文字列を説明した箇所には、こうあります。
検索時のオプションは「m[DELIMITER]Pattern[DELIMITER]km」です。 (m オプションが付いていますが、改行をまたいだ検索はできません。)
m は「^ と $ が文字列中の改行の直後・直前にマッチする」オプションです。それが付いているのに複数行検索はできない、とわざわざ断ってある。これはエンジン側ではなく サクラエディタ側の作り によるもので、ここを理解しておくと期待値がずれません。
| やりたいこと | 通常の検索・置換で |
|---|---|
空行を消す(^\r\n を空に) |
行の中で完結するので素直 |
行末の改行を対象にする(\r\n で検索) |
公式ヘルプが検索方法として案内している |
2行分をまとめて捕まえる(A\r\nB を探す) |
できない(公式ヘルプが明記) |
| 置換後の文字列に改行を出す(1行を2行に割る) | できる。 ただし「正規表現」がオンのときだけ |
「探す」はできないが、「作る」はできる
最後の行が、この節でいちばん誤解されているところです。
公式ヘルプで「置換後文字列に $1、\r\n 等を置くこともできます」と書かれているのは Grep 置換の解説だけ で、通常の置換ダイアログの解説には同じ記述がありません。そのせいで「Grep 置換ならできるが普通の置換ではできない」と読めてしまいますが、実際は通常の置換ダイアログでも改行を作れます。a,b,c という1行に当ててみると、こうなります。
| 正規表現 | 置換前 | 置換後 | 結果 |
|---|---|---|---|
| オン | , |
\r\n |
a b c の 3行に割れる |
| オフ | , |
\r\n |
a\r\nb\r\nc という 文字列がそのまま入る |
| オン | , |
\t |
タブ文字が入る |
つまり \r\n を改行として解釈するのは「正規表現」がオンのときだけ です。オフのまま打つと、バックスラッシュと r と n の4文字が本文に埋め込まれます。「置換後に \r\n と書いたのに改行にならない」の原因は、ほぼこれです。
検索側は行をまたげないのに、置換側は改行を作れる。非対称なのが、この機能のいちばん覚えにくいところ です。CSV を1列ずつの縦並びにばらす、; 区切りの設定行を1行ずつに割る——このあたりは通常の置換だけで片づきます。
ここには続きがあります。入る改行コードは、置換後の文字列に書いたとおり です。ファイル側の改行コードには合わせてくれません。
- CRLF のファイルに
\nだけを書いて置換 → その切れ目だけ LF になる - LF のファイルに
\r\nを書いて置換 → その切れ目だけ CRLF になる
どちらも改行コードが混在したファイルができあがり、保存しようとした時点でサクラエディタが「改行コードが混在しています。現在の入力改行コード LF に統一しますか?」と聞いてきます。置換したつもりが、改行コードをどうするかの判断を迫られる形です。
ここでの答えは、[はい] ならファイル全体がその改行コードに統一され、[いいえ] なら混在したまま保存されます。[はい] が揃えるのは置換で入った改行だけではありません。置換前から混ざっていた行も、まとめて書き換えられます(CRLF のファイルなら、元から LF だった行も CRLF になる)。差分を最小に保ちたいなら [いいえ] です。
行を割りたいだけなら、そのファイルの改行コードに合わせて書く(ステータスバーで確認できます)。CRLF のファイルには \r\n、LF のファイルには \n です。
どうしても複数行をまとめて扱いたい場合、実務では次のどちらかに倒すことが多いです。
- いったん改行を別の文字に置き換えて1行にする → 目的の置換をする → 戻す(対象が小さいときだけ)
- マクロに寄せる — 行をまたぐ制御はマクロ側の得意分野です
正規表現でできないことを正規表現で粘るより、道具を変えたほうが早いことがあります。
なお、.(任意の1文字)が改行にマッチするかどうかも、この文脈でよく問題になります。公式ヘルプの表には、Unicode 版の . について注釈が付いています。
.… (Unicode版)改行を除く任意の1文字。[^\r\n]と同じ ※ この処理は正規表現DLLではなく sakura側が入力された.を[^\r\n]に置き換えています。
. の扱いは、エンジンに届く前にサクラエディタが書き換えている、ということです。だから (?s) を付けても改行はまたげません。 alpha と bravo が別々の行にある状態で (?s)alpha.bravo を検索してもマッチせず、同じ行に alphaZbravo があるときだけマッチします。(?s) は「. を改行にもマッチさせる」オプションですが、その . がすでに [^\r\n] に差し替えられているので、効かせる相手がいないわけです。
🗂️ Grep 置換で複数ファイルを一括 — 危険から先に
ここが実務でいちばん効く機能です。そして いちばん危ない ので、危険から書きます。
通常の置換は編集中のバッファに対する操作なので、間違えれば元に戻せます。Grep 置換はディスク上のファイルを直接書き換えます。 開いていないファイルも、目で確認しないまま書き換わります。
厄介なのは、開いたままのファイルほど「戻っているように見える」 ことです。対象を開いた状態で Grep 置換をかけ、そのウィンドウに戻ると「このファイルは外部のエディタ等で変更されています。再ロードしますか?」と聞かれます。ここで再読込しなければ画面は置換前の内容のままですが、ディスク上はすでに置換後です。この状態で Ctrl + Z を押しても、ディスクは戻りません。バッファ側は何も編集していないので、undo する対象がそもそも無いからです。開いていないファイルなら、undo を受け取るウィンドウすら存在しません。画面の見た目で判断しないこと。
- 「バックアップ作成」を必ずオンにする(既定はオン。
.skroldが残ります) - 本番の前に、コピーしたフォルダで1回試す
- 対象がリポジトリなら、作業前にコミットしておく のがいちばん確実な保険です
中で何が起きているか
公式ヘルプは、Grep 置換の処理手順を4ステップで説明しています。図にするとこうなります。
.skrnew に書き出し"] B --> C{"バックアップ作成"} C -- "ON" --> D["元ファイルを
.skrold に改名"] C -- "OFF" --> E["元ファイルを削除"] D --> F[".skrnew を
元のファイル名に改名"] E --> F
バックアップ作成がオフだと、元ファイルは削除されます。 上書きではなく削除と改名で入れ替えるので、途中で失敗したときの残骸(.skrnew や .skrold)が見えるのはこの構造のためです。
残るバックアップの名前は、拡張子を置き換えるのではなく 末尾に足す 形です。a.txt を置換すると、隣にできるのは a.txt.skrold。ワイルドカードで後片付けするときは *.skrold で拾えます。
公式ヘルプは、もうひとつ現実的な注意も書いています。
サクラエディタ自身や他のプログラムが排他制御で書き込み禁止の場合、改名処理に失敗します。
対象ファイルを別のエディタやビルドツールが掴んでいると、そのファイルだけ置換されない状態になります。実際に1つのファイルを排他ロックしたまま Grep 置換をかけると、結果にはそのファイルだけこう出て、
file open error [C:\work\a.txt]
残りのファイルはそのまま置換され、最後に「5 個を置換しました。」と件数が出ます。止まってはくれません。 成功と失敗が同じ画面に混ざって出るので、実行後は件数だけでなく file open error の行が無いかも確認してください。
対象を絞る — 除外指定が効く
Grep 置換ダイアログでは、対象ファイルの指定に除外パターンが使えます。
| 書き方 | 意味 |
|---|---|
*.c, *.h |
カンマ・スペース・セミコロンで複数指定 |
!*.obj |
そのパターンのファイルを 対象から外す |
#*.svn |
そのパターンのサブフォルダーを 対象から外す |
公式ヘルプは「指定位置にかかわらず除外指定は検索指定より優先されます」としています。さらに 2.4.0.0 以降は、この ! と # をダイアログ上の「除外ファイル」「除外フォルダー」欄から直接指定できるようになりました。
ビルド生成物や依存ライブラリのフォルダを巻き込むと事故になるので、対象を広げる前に除外を書く のが順番です。
「サブフォルダーからも検索する」をオンにすると、.git のような先頭ドットの隠しフォルダーも普通に降りていきます。 リポジトリの直下に *.txt で Grep 置換をかけると、.git の中のファイルまで書き換わります。
リポジトリを対象にするなら、#*.git を除外フォルダーに入れてから実行してください。ビルド出力(obj node_modules .venv など)も同じです。
Grep 置換ダイアログ。除外ファイル/除外フォルダー欄と「バックアップ作成」が、事故を防ぐ2つのつまみ
文字コードセットの指定
Grep 置換のダイアログには文字コードセットの選択があり、自動選択・SJIS・JIS・EUC・Latin1・UTF-16・UTF-16BE・UTF-8・CESU-8・UTF-7・コードページから選べます。
Shift_JIS と UTF-8 が同居するフォルダに「自動選択」で一括置換をかけても、判定さえ当たれば、それぞれの文字コードのまま置換されます。 日本語がまとまって入っているファイルなら、自動判別はまず外しません。
危ないのは、その逆側です。判定材料が乏しいファイル ——ほぼ ASCII で日本語が数文字しかない、極端に短い、といったファイルは自動判別が滑ります。そして Grep 置換では 開いて確かめる工程が無い ので、滑ったことに気づけません。混在が疑わしいときは、拡張子やフォルダで対象を割って、文字コードを明示して回してください。
文字コードそのものが引き起こす「見た目と実データのズレ」については、同じサクラエディタの IVS(異体字セレクタ)対応の話が地続きです。→ サクラエディタ v2.4.3 の IVS 対応
⚠️ やってしまいがちな失敗
貪欲マッチが行を食い潰す
いちばん多いのがこれです。HTML のタグを消そうとして <.*> と書くと、1行まるごと消えます。
対象 : <b>重要</b>な連絡です
<.*> : 行の最初の < から最後の > までを1個とみなす(丸ごと消える)
<.*?> : 最短で止まるので <b> と </b> だけが消える
<[^>]*> : > 以外を集める。いちばん速くて確実
* や + は既定で 最大一致(貪欲) です。*? +? と書くと 最小一致 になります。公式ヘルプの表にも、量指定子は最小一致(無欲)と最大一致(欲張り)の対で載っています。
もっとも、.*? より [^>]* のような 否定文字クラス のほうが、意図が明確でバックトラックも起きません。CSV の例で .+ ではなく [^,]+ を使ったのは、これが理由です。
\d が全角数字にもマッチする
公式ヘルプの文字種の表には、はっきり書かれています。
| 記法 | サクラエディタ(Unicode 版)での意味 |
|---|---|
\d |
10進数字。2バイト文字=全角数字も含む |
\w |
単語の構成文字。bregonig では 2バイト文字も含む |
\s |
空白類文字。bregonig では [:space:] と同じで、全角スペース(U+3000)にもマッチする |
「数字だけ抜くつもりが全角数字まで拾った」「\w+ で英単語を取るつもりが、日本語の文が丸ごとマッチした」——どちらも、この仕様を知らないと原因が分かりません。
半角数字だけを狙うなら [0-9] と明示的に書く。 これが結局いちばん安全です。半角英数字なら [A-Za-z0-9_] と書き下します。
文字クラスの中の [ はエスケープが必要
bregonig では、文字集合の中に文字集合を書けるようになった代償として、[ そのものを書くときは \[ としなければならなくなりました(Ver.1.30 以降)。
たちが悪いのは、間違えてもエラーにならない ことです。a[b]c という行に対して次の3つを当てると、こう分かれます。
| 置換前 | 結果 |
|---|---|
[[] |
何も起きない(エラーも出ず、1件もマッチしない) |
[\[] |
[ にマッチする |
[]] |
] にマッチする |
] は素で書けるのに、[ だけはエスケープが要る。しかも間違えたときの反応が「エラー」ではなく「0件」なので、パターンの間違いなのか、対象に本当に無いのかが区別できません。 古い記事から持ってきたパターンが 0件で返ってきたら、まず文字クラスの中の [ を疑ってください。
エスケープしなくていいものをエスケープする
公式ヘルプの「ヒント」に明記があります。
正規表現を検索、置換、Grepで利用する場合、「
/」をエスケープしたり、「/」で囲ったりする必要はありません。
Perl の s/…/…/ の見た目に引きずられて / を \/ と書いてしまう例がありますが、ダイアログに入れるのは パターンそのもの です。もっとも、\/ と書いても / として動くので、これ自体が不具合の原因になることはありません。要らないだけ です。ただし例外があり、正規表現キーワード(タイプ別設定)で使う場合は /text\/css/k のようにエスケープするか m#text/css#k と書く必要があります。同じ正規表現でも、入れる場所でルールが変わります。
文字コードが混在したファイル
1つのフォルダに Shift_JIS と UTF-8 が混ざっているのは、日本語の現場ではまったく珍しくありません。単一ファイルの置換なら開いた時点で気づけますが、Grep 置換では気づけません。 前述のとおり、対象を割って文字コードを明示するのが確実です。
📚 もっと深く — 正規表現そのものを学ぶ
ここまで扱ったのは、サクラエディタという1つの道具の上での正規表現です。記法の裏側にある考え方——バックトラックがなぜ起きるのか、貪欲と最短で何が変わるのか——は、エディタを離れても同じように効いてきます。
この分野の定番として知られているのが『詳説 正規表現』(Jeffrey E. F. Friedl 著/オライリー・ジャパン)で、正規表現エンジンの動作原理からパターンの書き方までを扱った一冊です。
※本記事にはアフィリエイトリンク(Amazon アソシエイト)が含まれます。
✅ まとめ
- サクラエディタの正規表現は bregonig.dll が処理している(v2.4.3 同梱は Ver.4.20、エンジンは Onigmo 6.2.0)。「Perl と同じ」ではない
- 2.4.0.0 以降、正規表現ライブラリは 配布物に同梱。DLL を別途入れる時代の記事は世代が違う
- 後方参照は 検索側が
\1、置換側が$1(サクラエディタでは\1も可)。数字が続くときは${1} - 複数行にまたがる検索はできない(公式ヘルプが明記)。
.は sakura 側で[^\r\n]に置き換えられているので(?s)を付けても変わらない - 一方で 置換後に
\r\nと書けば1行を2行に割れる。ただし「正規表現」がオンのときだけで、オフだと\r\nの4文字がそのまま入る - Grep 置換はディスクを直接書き換え、Ctrl+Z で戻せない。バックアップ作成をオンにし、除外指定を先に書く
\d\wは 全角・2バイト文字も拾う。半角だけを狙うなら[0-9]と書き下す
正規表現は、覚える記号の数のわりに戻ってくるものが大きい道具です。まずは空行削除と行末空白の除去から。それが手に馴染んだら、次は CSV の列入れ替えを試してみてください。「これ、手でやってたな」という作業が1つ消えるたびに、テキストの扱い方そのものが変わっていきます。
よくある質問
Q: サクラエディタで正規表現を使うのに、DLL を別途インストールする必要はありますか?
A: v2.4.0.0 以降は不要です。公式ヘルプの Grep 置換の項に「sakura:2.4.0.0以降では配布物の中に含まれますが、それ以前のバージョンでは別途入手する必要があります」と記載があり、v2.4.3 のインストール先にも bregonig.dll が同梱されています。
Q: サクラエディタの正規表現は Perl と同じ書き方ができますか?
A: 同じではありません。正規表現ライブラリ bregonig.dll のドキュメントは Ver.3 以降を「Perl 5.14 互換」と位置づけていますが、変数展開などは使えない一方、戻り読みや名前付きグループなど Onigmo 由来の機能が使えます。互換をめざした別実装、と考えるのが実態に近いです。
Q: 置換後の文字列で、$1 と \1 はどちらを使うべきですか?
A: どちらも使えます。公式ヘルプは置換側の基本を $n とし、「サクラエディタでは $n の代わりに \n も使用できます」としています。参照の直後に数字を書きたい場合は ${1} を使ってください。
Q: 2行にまたがる文字列を検索・置換できますか?
A: 通常の検索・置換ではできません。公式ヘルプの「検索」の項に「二行以上(複数行)にまたがった検索は、今のところできません」と明記されています。複数行の整形が必要な場合はマクロを使うか、いったん改行を別の文字に置き換える方法を検討してください。
Q: 置換後の文字列に \r\n と書いて、1行を2行に分けられますか?
A: 分けられます。ただし 「正規表現」チェックボックスがオンのとき だけです。オフのまま実行すると、\r\n という4文字がそのまま本文に入ります。なお、入る改行コードは書いたとおりになるため、LF のファイルに \r\n を書くと改行コードが混在し、保存時に「改行コードが混在しています」と確認されます。ファイル側の改行コードに合わせて書いてください。
Q: Grep 置換を実行したあと、元に戻せますか?
A: Ctrl + Z では戻せません。ディスク上のファイルを直接書き換えるためです。そのファイルを開いたままでも同じで、再読込しなければ画面は置換前のまま残りますが、ディスクは戻りません。ダイアログの「バックアップ作成」をオンにしておくと元ファイルが .skrold として残るので、これで戻します。オフの場合、公式ヘルプの手順どおり元ファイルは削除されます。
関連記事
- サクラエディタ v2.4.3 更新手順とダークモード設定|約3年8か月ぶりの大型更新 — 本記事で扱った v2.4.3 の入手・インストール・ダークモード設定と、新機能3本柱の解説
- 不可視Unicodeマルウェア「GlassWorm」を解剖|GitHub/npm/VSCode汚染 — 「見た目と実データがずれる」文字コードの話が、攻撃に使われた事例
