初学者も安心 正規表現について

2025.06.112025.06.12

Web制作 システム その他

正規表現(せいきひょうげん)という言葉を聞いたことはあるでしょうか。 テキストエディタでgrep検索を使用している人であれば馴染みがあるでしょうか。検索エンジンやエクセルで接する機会もありそうですが、正規表現として改めて知る機会は少ないかもしれません。プログラム言語やサーバーを扱う仕事であれば、避けては通れない正規表現。上手く使うとファイル検索や、検索エンジンでも強力な武器になります。その使い方を見ていきましょう。

正規表現とは

正規表現とは「文字列のパターンを記述して検索・抽出・置換を自在に行うための表現方法」です。文字列の汎用的な記法のひとつです。文字列の検索・抽出・置換などに非常に効果的であり、複雑なパターンの組み合わせをごく短い文で表現することができます。

簡単な例

といってもピンと来ないと思いますので具体的な説明の前に簡単な例を挙げます。なるほどそんなことが簡単に表現できるのだなとざっくり捉えておいてください。改行などは正規表現のメリットを感じやすい例です。

[bcl]ook

book もしくは cookもしくはlookを意味します。[]は「b もしくは c もしくはlのどれか1文字」を意味します。

\n

改行を表します。テキストエディタで改行位置を検索したいときに使います。

.+\.png

拡張子「.png」を表します。

英語で何と言う?

正規表現ってなんだか直訳風ですよね。英語ではRegular Expression。やはり直訳ですね。IT用語あるあるです。略してRegEx(レゲックス)などとも呼ばれます。

メタ文字について

上記の例で出てきた[]\.+などの記号はメタ文字と呼びます。日本語では量指定子と言います。正規表現において特殊な意味を持つ文字列です。のちほど詳しく紹介しますがメタ文字には他にも*^{}~$?<⇒などがあります。キーボードで見かけるけど使ったことのない記号を全部使う勢いです。その組み合わせで様々な文字列を表現することできます。

メタ文字を検索したい場合はエスケープ

正規表現においては特殊な役回りをするメタ文字ですが、当然ですが一般の文字としての役割もあります。上記の例で言えばファイルの拡張子を表すときに.(ドット)を含む文字列を使用する必要があります。

そこで使用するのがエスケープです。\(バックスラッシュ)を使用します。\. と書くことで「文字列としての.(ドット)」を表現することができます。2文字で1セットです。\.png と書くことで「.png」という文字列を表現することができます。

メタ文字としての.は「任意の1文字」を意味するため、エスケープなしの .png という表現は「任意の1文字とpng」という意味になってしまい、「apng」「bpng」「.png」「zpng」など幅広い文字列を意味してしまいます。

なおエスケープに使われるバックスラッシュ自身もメタ文字のため、文字列としてのバックスラッシュは\\となります。

円記号とバックスラッシュ

\(バックスラッシュ)についても言及しておきます。日本語キーボードの¥キーに当たるものがバックスラッシュです。ブラウザのURLで使用する/(スラッシュ)の反転バージョンなのでこう呼びます。

英語環境であれば何も問題ないのですが、日本語環境では同じキーを押しても¥(本来は半角の円記号)で表示されるときと\(バックスラッシュ)が表示されるときがあるため非常にややこしいです。日本語Windows環境ですと、VS CodeやDOSシェルではバックスラッシュですし、エクスプローラーでは半角の円記号が表示されます。見た目が違うだけでどちらもバックスラッシュと考えましょう。

原因は文字コードの違い

バックスラッシュ問題の原因は文字コードの違いにあります。英語圏ではASCIIコードが標準的に使われており、バックスラッシュの記号は「0x5C」というコードで表現できます。英語ベースのコンピューターを日本に導入する際に、日本独自に拡張した日本語文字コードを作成しました。いわゆるShift JISです。Shift JISでは「0x5C」に半角の¥を割り当ててしまいました。当時のオフィスPCの需要のメインは表計算でしょうから円記号は必須だったのでしょうか。このため昔のMS DOSではシェル内でもバックスラッシュは半角円記号でしたし、現在のエクスプローラーもそのように表示されます。VS CodeなどはUTF-8 のためきちんとバックスラッシュが表示されます。

メタ文字の種類と意味

代表的なメタ文字を紹介します。これらを組み合わせるだけで数多くの表記パターンを表現することができます。

.(ドット)

任意の1文字を表します。「任意の」というと難しく感じますが、なんでも1文字ということです。1文字には半角も全角も数字も記号も含まれます。但し、改行やタブなどは含まれません。

…/.jpg は任意の3文字の連続に.jpgの拡張子がついた文字列を表します。例えば3桁の連番のJPEG画像だけ抽出したい場合などに使えます。では桁数不明の場合はどうすればよいでしょうか。

.+(ドットとプラス)

2つのメタ文字の組み合わせですが、これはひとくくりに覚えておいてもよいでしょう。任意の1文字を表すドットと、1回以上の繰り返しを表すプラスで「1文字以上の任意の文字列」となります。.+/.jpg では.jpeg拡張子を持つすべての文字列とマッチさせることができます。

しかしJPEGには.jpgと.jpegの拡張子が存在します。両方をマッチさせるにはどうすればよいでしょうか。

?(エクスクラメーションマーク) +(プラス) *(アスタリスク)

いずれも文字の繰り返しを表現する記号です。それぞれの意味の違いは紛らわしいので表にまとめます。

メタ文字意味繰り返し回数使用例
+1回以上繰り返す1回以上(0回ではない)a+ → a/aaa/aaaa
*0回以上繰り返す0回~a* → a+と同じ意味に加えてnull(空文字)も表す
?0回または1回最大でも1回a? → a もしくは null(空文字)

ですから上記の.jpg と .jpeg を含むすべての文字列を表すのは .+\.jpe?g になります。.+が任意の1文字以上、\.が文字列のドット、jpe?g がjpeg もしくは jpg を表します。

^(キャレット) $(ダラー)

行の先頭と最後を表現するメタ文字です。^abc は「abcで始まる文字列」を、 abc$ は「abcで終わる文字列」を、 ^abc$は「abcの完全一致」を表します。

実用例としては ^http でhttpから始まる文字列をマッチさせることができます。\.co\.jp$ では.co.jpで終わる文字列を抽出できます。

^$は空白や空行をマッチさせることができます。

.*(ドットとアスタリスク)

こちらも2文字の組み合わせですが使いやすいので紹介します。「任意の1文字」と「直前の文字の0回以上繰り返し」を組み合わせることで「任意の文字が0回以上」となります。何文字でも0でも可という表現です。

.*abc.* で「abcを含む全て」を表現できます。.+ と違い0回でも構わないため幅広くマッチさせることができます。例えば商品の品番が関連画像のファイル名に必ず含まれていることがわかっていれば .*品番.* で一旦候補を絞り込むことができます。

|(パイプ)

区切り文字のパイプはOR検索を意味します。このメタ文字の良いところは文字列を1文字づつではなく、かたまりとして捉えることができる点です。a|b で「AまたはB」になるだけでなく、apple|orange で「appleまたはorange」を表現できます。

[](ブラケット 角括弧)

括弧内の文字列のいずれかを表すことができます。gr[ae]y はgray もしくはgrey を表します。括弧には[0-9]や[a-z]を指定できることが最大の利点です。それぞれ「0~9のいずれか1文字」「a~zのいずれか1文字」を表します。大文字と小文字を区別しますので両方マッチさせる場合には[a-zA-Z]とスペースなしで記述します。

応用編として先頭にキャレットを置くと否定を意味します。[^a-z] は「小文字の英字以外の1文字」を表します。このようにブラケットの中ではメタ文字としての役割を失います。

[0-9]{3}-[0-9]{4} これは何でしょうか?答えは郵便番号です。

{}(カーリーブラケット 波括弧)

波括弧{}はここでは回数を指定しています。つまり桁数です。「0~9のいずれか1文字を」「3回繰り返す」ハイフン「0~9のいずれか1文字を」「4回繰り返す」ということで、日本の郵便番号の形式を抽出することができます。郵便番号のように型が決まっている文字列は正規表現で表現可能です。

{4}は必ず4桁となる点には注意が必要です。1~4桁のように幅がある場合には{1,4}となります。電話番号のように型にバリエーションがある場合に使います。{2,}のように記述すると2桁以上を表現できます。

()(パーレン 丸括弧)

パイプのところでも書きましたが、メタ文字は基本的に1文字しか扱えません。文字列をまとめて対象としたい場合には()で括ります。

.jpg もしくは .jpeg を/.jpe?g と表現しましたが、\.(jpg|jpeg) と書くこともできます。ファイルの拡張子で文の終わりであることが確定しているのであれば \.(jpg|jpeg)$ でもよいでしょう。

\n \t \r

テキストエディタやCSVデータではお馴染みの正規表現です。\n は改行、\t はタブを意味します。通常の検索では表現のしようがないこれらの文字列をマッチさせることができます。\r はリターンを意味します。エディタによっては\nで改行がマッチしないことがあり、こちらを使用します。

\s \b \d \w \l \u

\s
半角の空白文字(半角スペース)にマッチします。改行コード、タブコードも含みます。

\b
ワードの区切りを表します。英文であれば半角スペースがワードの区切りとなりますので、\bis\b という記述で 半角スペースis半角スペースとなり、BE動詞のisのみマッチさせられます。issue assist kissなどの単語はマッチしません。

\d
全ての半角数字を表します。\d\d\d\d は2025、1234など4桁の数字を表します。

\w
すべての半角英数字とアンダースコアです。

\l
すべての半角英小文字です。エクセルでいうところの=lower()です。lowerは小文字という意味です。

\u
すべての半角英大文字です。エクセルでいうところの=upper()です。upperは大文字という意味です。

\S \B \D \W \L \U

大文字にすると「~以外の全て」という意味になります。例えば \D は「半角数字以外」となります。

応用の実例

最後に実用性のありそうな例を挙げていきます。ここまでに紹介した内容で表現できるものばかりです。

^0\d{1,4}-\d{1,4}-\d{4}$

日本の電話番号には様々なパターンがあります。携帯の000-0000-0000、東京・大阪なら00-0000-0000、中規模の都市では000-000-0000、人口が少ない県では0000-00-0000。すべてのパターンに対応した正規表現がこちらです。ハイフンの後に?を入れることでハイフンのあり・なしにも対応できますが、そうなると12桁の数字が全部マッチするので主旨と異なるかもしれません。

^0で文頭は0から始まる、/d{1,4}で1から4桁の数字、-はハイフン、最後に文末の$です。

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

メールアドレスの正規表現です。[a-zA-Z0-9._%+-]+はアドレスで使用可能なすべての文字列の桁は無限、@はアットマーク、[a-zA-Z0-9.-]+は、ホスト名に記号は使えませんので英数のみの桁は無限、\.はドット、[a-zA-Z]{2,}は、ドメインは英字2文字以上ですのでその指定です。

https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(\/\S*)?

URLの正規表現の例です。https?://はSSLのsの有無を考慮してs?、[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}はメールアドレスと同様、(\/\S*)?はスラッシュとスペース以外を指定しています。

まとめ

最初に応用の実例を見るとわけがわからずそっと画面を閉じたくなりますが、ひとつひとつ分解して見ていくと意外と簡単です。パイプで区切るとor検索、^$を付けると文頭文末、?を付けるとありなし両方などのなんとなく使いやすそうなものだけでもまずは使ってみてはいかがでしょうか。

お問い合わせCONTACT

株式会社エー・エム・ティーは
印刷物からホームページ制作・更新運用管理までトータルサポート。
企業様の課題解決や企業価値向上のお手伝いをいたします。

受付9:00~18:00 ※土日祝除く