中山テック 代表の中山です。
さて、タイトル通り今回は正規表現についてのブログとなります。
正規表現とは「文字列の集合を一つの文字列にする」といった表現がありますが、訳わかりません。
例えばテキストファイルに文字があり、下は改行のみ、その下に文字があるという場合。
改行のみを削除して文字列をつなげたい場合、普通の置換では難しく正規表現を使います。
まずは基礎、そして事例から見た応用方法をご説明したいと思います。
目次
基本的な正規表現
まずは正規表現がどのような働きをするかお話します。
文字 | 意味 | 使用例 | 使用例の意味、シチュエーション |
---|---|---|---|
^ | 〇〇から始まる文字列 | ^中山テック | 行頭「中山テック」から始まる文字列 主に行数の多いファイル検索や置換で使用 |
$ | 〇〇で終わる文字列 | 中山テック$ | 行末「中山テック」で終わる文字列 *$で行全体 |
. | 任意の一文字 | 中山.ック | 「中山〇ック」といった 文字列がないか検索したい時に使用 |
+ | 直前の文字が1回以上 繰り返す場合 | 中山テ+ック | 「中山テ」で始まり、「ック」で終わる 文字列を検索したい場合 |
* | 直前の文字が0回以上 繰り返す場合 | 中山テ*ック | 「テ」を何回使っているか検索する。 「中山テテテック」でも「中山ック」でも 引っかかるが、「中山タック」では 引っかからない。「.ック」とは別物 |
? | 直前の文字が0回 または1回以上 繰り返す場合 | 中山テ?ック | 「テ」が0回、1回使われているか検索。 「中山ック」や「中山テック」はOK。 |
.* | 任意の文字が 一文字以上 | 中山.*ック | 「中山あいうえおテック」といった 任意の文字列でも検索できる |
| | いずれかの条件に 当てはまる(or) | 中山|テック | 「中山」もしくは「テック」に 当てはまる条件を検索したい場合 |
[文字] | いずれか一文字 ※文字指定 | 中山[て] | 「中山てっく」と平仮名が入っているか 調べたい場合など |
[^文字] | 含まれない | 中山[^テ]ック | 「中山テック」以外がないか 調べたい場合など |
[0-9] | 数値検索 | TOKYO[0-9] | 範囲指定で「TOKYO2020」を調べる等 |
[a-z] [A-Z] | アルファベット 検索 | ^[a-z][A-Z] | アルファベットで始まる文字を調べたい といった場合 |
\t | タブ | 不要なタブがないかを検索 |
他にもまだまだありますが、よく使われる正規表現となります。
これ以外で必要なものは検索すると出てきますので是非調べてみてください。
どこで使うか
エディタやExcelなどで使用するケースが多いです。
普通にパソコンを使っている限り正規表現を使うことはないですが、大量の文字を扱う必要があり
検索したり置換したりする場合に役に立つので早速見ていきましょう。
※画像は「サクラエディタ」を使用しました。正規表現が簡単に使えるので便利ですョ!
空行を消したい
まず、下記の画像のように空行が多い場合は「^\r\n」で検索します。
やり方は「空行を検索」「空行を何もなし」に置換します。
サクラエディタの場合は「検索」タブから「置換」を選択します。
これで改行のみの行はすべて削除されました。
^は行頭、上記画像の下部見ると「CRLF」とあるので改行コードは「\r\n」となります。
つまり「行頭に改行しかない行は削除する」という意味の正規表現になります。
応用
指定した文字の前の文字列を全て消す
上記は見出し(h2)タグを抜き出したものです。
しかしh2以前の文字列(検索結果、場所とファイル名)が邪魔です。
h2のタグで検索、削除しても結果は消えないですし、文字列も全部違います。
そこで「(.*)(<h)」という形で検索、置換後は「<h」だけを残します。
無事h2つきの見出しのみになりました。
だいぶ見やすくなったでしょう。
最短一致
正規表現には「最長一致」と「最短一致」という考え方があります。
ちなみに冒頭で説明した「*」は直前の文字を0回以上繰り返しているかを判定しています。
※中山テ*ックなら、「中山ック」でも検索に引っかかります
しかし、「*?」にすると考え方は違ってきます。
※〇文字以上の検索に?をつけると最短一致検索を行う
例えば、上記の検索結果「<h2>」「</h2>」で囲まれたタグを検索するとしましょう。
すると<h2>~</h2>のすべての文字列が検索に引っかかりました。
しかし、<h2>タグだけを消したい場合は「違う、そうじゃない」という状態になります。
そこで最短一致検索、*のうしろに?を付与します。
するとあらビックリ!
タグの箇所だけ検索に引っかかりました。
最長一致検索の場合、タグが複数あった場合は間の文字列も一致として見ているようです。
最短一致の場合はタグが複数あっても、タグのみを一致として見ています。
使い分けが難しいですが、覚えると非常に便利なので是非使ってみてください!
数値から始まる行を消したい
下記の正規表現で簡単に消せます。
^[0-9].*\r\n
※改行コードがCRのみの場合は「\r」、LFのみの場合は「\n」としてください
すべて置換ボタンを押下することですべて消えます。
その他タグのご紹介
文字 | 意味 | 使用例 | 使用例の意味、シチュエーション |
---|---|---|---|
*? | 〇〇から始まる 文字列(最短一致) | <.*?> | 上記でも説明したが、タグのみを 検索したい場合など |
(...) | 複数正規表現で 検索するときの 文字の塊 | (.*)(<h) | <hまでの全ての文字列を検索 |
{n} | nは数値。 繰り返し回数を指定。 | [0-9]{4} | 年を取得したい時 2022も←で引っかかる |
~以外を抽出
この文字列では「タイトル:」から始まる行を抜き出したいと考えました。
もしサクラエディタのGrep機能を使うなら「タイトル:」で検索すれば良いのですが
正規表現を使用するのであれば「タイトル:」から始まるもの以外の行を削除するのが良いでしょう。
^(?!タイトル).+$\r\n
「タイトル」から始まる以外の行で、ついでに最後の改行も消しちゃえ!という正規表現です。
ほいで実行すると・・・
まとめ
いかがでしたでしょうか。
主に開発現場などで威力を発揮する正規表現。
しかし、ホームページ制作でも使えることも多く、是非覚えて欲しい技術になります。
他にもサーバにログインした時に文字列検索する際も非常に使えます。
「どのプログラムにブログで使った画像ファイル名の定義があったかなぁ・・・」という際には
grep -r "blog-[0-9]{8}-[0-9]{2}.jpg" *
これで「blog-20220111-01.jpg」といったファイルがどこで使えるかがわかります。
Excelでも使えますし、いろいろ試してみてください!