はじめに
この記事では、正規表現の基本から実用例までを一気に整理します。
「正規表現って難しそう…」と感じている方でも、代表的な記号と使い方を押さえればすぐに使えるようになります。
1. 正規表現とは?
正規表現(Regular Expression, regex)とは 「文字列の条件を指定するためのルール」 です。
「ある文字列の中から特定のパターンを探したい」ときに強力な武器になります。
例:
- 正規表現:
abc
- 対象文字列:
"123abc456"
- →
abc
にマッチする
2. 基本の考え方:完全一致と部分一致
-
完全一致
パターン全体と文字列全体が一致することを指します。
例:^abc$
は"abc"
にのみ一致します。 -
部分一致
文字列の一部がパターンに合致すればOK。
例:abc
は"123abc456"
の「abc」に一致します。
正規表現は「検索」や「抽出」に使う場面が多いため、部分一致を理解すると便利です。
3. よく使うメタ文字・記号
代表的なものを押さえると一気に使いやすくなります。
記号 | 意味 | 例 |
---|---|---|
. |
任意の1文字(改行を除く) |
a.c → "abc" , "axc" に一致 |
* |
直前の文字が0回以上繰り返す |
a* → "" , "a" , "aaa"
|
+ |
直前の文字が1回以上繰り返す |
a+ → "a" , "aaa"
|
? |
直前の文字が0回または1回 |
a? → "" , "a"
|
{n,m} |
直前の文字がn~m回繰り返す |
a{2,4} → "aa" , "aaa" , "aaaa"
|
[abc] |
a または b または c |
[cb]at → "cat" , "bat"
|
[^abc] |
a, b, c 以外の1文字 |
[^0-9] → 数字以外 |
[0-9] |
0から9のいずれかの数字 |
[0-9]{3} → 数字3桁 |
^ |
行頭を表す |
^Hello → "Hello world" に一致 |
$ |
行末を表す |
world$ → "Hello world" に一致 |
(abc) |
グループ化(キャプチャも可能) |
(abc)+ → "abcabc"
|
(?:abc) |
グループ化のみ(キャプチャなし) | |
\ |
特殊記号を普通の文字として扱う |
\. → "." に一致 |
4. 便利な特殊シーケンス
よく使うショートカットを覚えると効率的です。
シーケンス | 意味 | 例 |
---|---|---|
\d |
数字(0-9と同じ) |
\d{3} → "123"
|
\D |
数字以外 | \D+ → "abc!" |
\s |
空白(スペース・タブなど) | a\sb → "a b" |
\S |
空白以外 | \S+ → "hello" |
\w |
単語構成文字(英数字+アンダーバー) | \w+ → "word_123" |
\W |
\w以外 | \W+ → "!? " |
\b |
単語の境界 |
\bcat\b → "the cat sat"
|
5. 実用サンプル集
メールアドレスのチェック
^[\w._%+-]+@[\w.-]+\.[a-zA-Z]{2,}$
電話番号の抽出(ハイフンあり)
\d{2,4}-\d{2,4}-\d{4}
日付フォーマットの検出(YYYY/MM/DD)
\d{4}/\d{2}/\d{2}
HTMLタグを取り除く(簡易版)
<[^>]+>
特定キーワードを含む行の抽出(例: "ERROR")
^.*ERROR.*$
6. 正規表現を使うときの注意点
-
複雑化は避ける
1行で書こうとすると読みにくくなります。必要なら分解しましょう。
例: 長いパターンをグループごとに分けてコメントを付ける。 -
パフォーマンスに注意
一部のパターンは「バックトラッキング」と呼ばれる仕組みで遅くなることがあります。
例:.*.*
のような曖昧すぎるパターンは避ける。 -
可読性の工夫
コメント付き正規表現(PythonやPerlのre.VERBOSE
)を使うと見やすくなります。
例: 改行やインデントを使って複数行で書ける。 -
言語ごとの差異
JavaScriptとPythonでは一部挙動が異なります。利用する環境の仕様を確認しましょう。
例: Pythonの\d
はUnicode数字全般にマッチするが、JavaScriptは0-9のみ。
7.regex101で正規表現を試してみよう
今回は、無料で使える regex101を使って、簡単な例を試してみます。
まずはテキストに画像のような文章を入れてください。
その次に
正規表現を入力してみましょう。
\d+
- \d は「数字(0〜9)」
- +は「1文字以上続く」
つまり 「数字が1文字以上並んでいる部分を全部探す」 という意味です。
実際に regex101 に入力すると、すべての数字が青くハイライトされます。
次に、郵便番号っぽい「3桁-4桁」の形式だけを探してみましょう。
\d{3}-\d{4}
まとめ
正規表現は最初は難しく感じますが、「ちょっと試して結果を見る」 を繰り返すことで、だんだん使えるようになります。
ぜひ regex101 を開いて、この記事の例を試してみてください。