正規表現を用いてファイル内検索をする方法

2024 / 02 / 08

正規表現で検索できるのが便利すぎるので、まとめました。

そもそもどんなときに使うの?見出し「そもそもどんなときに使うの?」

私が正規表現を用いたファイル内検索に出会ったのは、『使いにくいヒューマンインターフェースの館』のHTMLバージョンをホームページ上に埋め込んでいる時でした。
「使いにくいヒューマンインターフェースの館」ではそれぞれのスライドが個別のHTMLファイルとなっており、ページを遷移することでスライドの動作を再現しています。
ここで

const nextPageUrl = '../slide1.html';

のように遷移先を指定していたのですが、実際にホームページとしてビルドした際のURLは、

const nextPageUrl = '../slide1/index.html';

であることが判明したのです。
数カ所であれば「まぁ頑張ればいっか」と思えるかもしれないけど、35ファイル64ヶ所も…
VSCodeで正規表現使えたらなぁ…と思いながらダメもとで調べたら、当然のように実装されていました。笑

正規表現で検索する方法見出し「正規表現で検索する方法」

VSCodeでは cmd + F でファイル内検索
cmd + shift + F または左上の「虫眼鏡マーク」でファイル横断検索ができます。
ただしこのままでは正規表現を用いた検索はできません。
検索窓の右側にあるオプションのうち、一番右側にある .*をクリックして有効にします。
これで準備が整いました!

実際に検索見出し「実際に検索」

今回の例では slide1.htmlのように可変部分が数字なので、数字を表すdと2けたの数字も含むので、それを複数回繰り返すという意味の+で検索します。
具体的には検索窓に

slide\d+.html

といれて検索します。
すると条件に一致する部分が全て検索結果として表示されるはずです!

置換してみる見出し「置換してみる」

じゃぁ早速置換しよう! と思って、置換文字列を入れようとしたときにあなたは気づくでしょう。
あれ、せっかくの数字、反映できなくね…?
そうです。今のままでは検索した文字列がそのまま全て置換され、次のようになってしまいます。

- const nextPageUrl = '../slide23.html';
+ const nextPageUrl = '../slide1/index.html';

そう、全てslide1になってしまいました。
しかし、当然ですが、これも解決策があります。

正規表現で一致した部分を、置換でそのまま用いる見出し「正規表現で一致した部分を、置換でそのまま用いる」

まずは検索文字列の正規表現部分を()で囲みます。

slide(\d+).html

次に置換する文字列の対応する部分を$1に書き換えます。

slide$1/index.html

これで置換結果に一致部分が反映されているはずです。

- const nextPageUrl = '../slide23.html';
+ const nextPageUrl = '../slide23/index.html';

複数箇所に正規表現を用いた場合見出し「複数箇所に正規表現を用いた場合」

先ほど利用した$1()で囲った正規表現の順番に対応しています。
なので3個目の()を利用したかったら$3とすることで利用することができます。
ちなみに()の中身は正規表現である必要はありません
なので「検索した文字列の前に何か追加したい」といういうようなときにも利用出来ます。

Xcodeの場合見出し「Xcodeの場合」

Xcodeの場合には正規表現をGUIから挿入することができるので、正規表現を調べる手間がかかりません。また正規表現をどうしても用いたい場合には、用いて検索することももちろん可能です(さすがApple)。

GUIで挿入見出し「GUIで挿入」

検索窓の右側にある+を押すと挿入できるものの一覧が表示されます。そこから検索条件にマッチするものを選択すれば完了です!
また当然$を用いた置換も行えます。このとき()で囲う必要はありません。

正規表現を用いる見出し「正規表現を用いる」

もしかしたらGUIからの方法では満足できない方もいるかもしれません(実際にはGUIでは拡張性に問題がある?かもしれない?)。
XCodeで正規表現で検索するには検索窓の右側、Containsの部分をクリックし、Regular Expressionを選択します。
使い方はVSCodeと一緒ですが、同時にGUIのものも利用可能です。

正規表現一覧見出し「正規表現一覧」

一般的なもの見出し「一般的なもの」

\          // エスケープ文字 - ピリオド、括弧などの特殊文字を見つけるために使用。
.          // 改行以外の任意の文字に一致。
x          // xに一致する任意の文字。
^x         // x以外の任意の文字に一致。
[x]        // 括弧内の範囲でxに一致する任意の文字。
|          // OR演算子 - xまたはyに一致。
()         // 文字列やマッチングのシーケンスをグループ化するために使用。
{}         // 数量子を定義するために使用。
{x}        // x回発生するマッチ。
{x,}       // x回以上のマッチ。
{x,y}      // x回以上、y回以下のマッチ。
?          // 直前のマッチはオプションであるか、1回のみ。{0,1}と同意
*          // 直前ののマッチが0回以上。{0,}と同意
+          // 前のマッチが1回以上。{1,}と同意
^          // 行の先頭に一致。
$          // 行の末尾に一致。

[:alpha:]  // アルファベットの文字。
[:digit:]  // 10進数の数字。
[:alnum:]  // 英数字文字([:alpha:]と[:digit:])。
[:space:]  // スペース文字(他の空白文字ではない)。
[:print:]  // 表示可能な文字。
[:cntrl:]  // 非表示文字。
[:lower:]  // 小文字(大文字にも一致する場合、オプション)。
[:upper:]  // 大文字(小文字にも一致する場合、オプション)。

\d         // 数字。[0-9]と同じ。
\D         // 数字以外。[^0-9]と同じ。
\s         // 空白文字(スペース、タブ、改行など)。
\S         // 空白以外の文字。
\w         // ワード文字。
\W         // ワード文字以外。
\b         // ワードの境界(クラス内ではバックスペース)。
\B         // ワードの境界以外。