文中の説明画像をクリックすると拡大します。
正規表現とは
「正規表現」とは、アルファベットや記号、数値などからなる文字列の組み合わせを照合するために用いられるパターン記法です。
英語では「Regular Expression」と言い、「Regex」と省略して表記されることもあります。
文字列の組み合わせを照合する例としては、以下をイメージすると良いでしょう。
ショッピングサイトで買い物をしている時、会員登録が必要な場面がよくあります。
メールアドレスとパスワードを入力すると、会員画面にログインし、決済ができるという仕組みなどです。
その際に、入力した文字列がメールアドレスまたはパスワードとして適切かどうか照合するために、正規表現が使われています。
また、正規表現のパターンは、その文字列における規則性や特徴のことを指します。
例えば、「2021/01/01」という日付を表す文字列をパターン化して表記すると、このようになります。
^[0-9]{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$
それぞれの記号や数字が表す意味は、「年/月/日」という日付の規則性を表しています。
正規表現の内部では文字列の特徴が整理されているため、コンピューター上で文字列の照合を行う際には非常に便利です。
正規表現でなにができるのか
検索機能
正規表現は、文字列内に特定の文字列や似たような特徴を持つ文字列を検索するために使用されます。
検索機能がありますが、これは正規表現を使う最大のメリットです。
例えば、「色」「黄色」「色々」は、共通して「色」と言う文字が使われている文字列ですが、その中から「色」だけで成り立つ文字列を探したいという時です(「黄色」や「色々」は検索したくない場合)。
置換やパターン確認
また、正規表現は、文字列の置換や、文字列が規定されたパターン通りかどうかを確認することもできます。
「黄色」の「黄」の部分を「青」に置き換えたい場合や、「色を含む2文字以上の文字列である」という規定をクリアした文字列を確認したい場合、などに正規表現が役立ちます。
具体的な使用場面
先ほど、ショッピングサイトの会員登録の場面を例にしました。
ユーザーが入力した文字列が「適切なメールアドレスとパスワード」だった場合には、会員登録画面へログインできます。
しかし、入力したパスワードの文字列が適切でない場合は、例えば「パスワードの文字数が短すぎます」というエラー文が返ってくることがあると思います。
このような仕組みを作るとき、正規表現が使われています。
実際のログインの場面で、もし「123@○○.com」というメールアドレスと「123」というパスワードを入力しただけで会員登録できてしまったとしたら、どうでしょうか。
あまりにも単純で想像しやすく、誰かが当てずっぽうで入力してもログインできてしまうかもしれません。
これでは、セキュリティ上問題があるでしょう。
「簡単に想像できず、ある程度複雑なメールアドレスとパスワードである」という条件をクリアしないと会員登録ができない仕組みなどを作れるのが、正規表現の特徴でもあります。
実際には、メールアドレスやパスワードの場合、「数字・記号・アルファベットの組み合わせで何文字以上」とパターン化することなどが一般的です。
基本的な正規表現
正規表現には、「メタ文字」という特別な意味を持った文字が含まれています。
メタ文字とは、例えば以下のような条件を表すための機能を持った文字のことです。
- 文字列がアルファベットと数字の組み合わせかどうか
- 文字列が3文字以上使われているかどうか
つまり、メタ文字自体が文字列ということではなく、メタ文字を使って意味のある文字列の組み合わせを作る、パターン化することができる、という意味です。
メタ文字には様々な種類がありますが、もっとも基本的なメタ文字には以下のようなものがあります。
- 「.」:任意の1文字を表す
- 「?」:直前の文字が0個か1個であることを表す
- 「*」:直前の文字が0回以上繰り返すことを表す
- 「+」:直前の文字が1回以上繰り返すことを表す
- 「|」:いずれかの条件(OR)を表す
- 「\」:直後のメタ文字を通常の文字として扱う
- 「[]」:このメタ文字内にある文字のどれか1文字を表す
- 「()」:文字列を1つのグループにまとめる
- 「{}」:直前の文字を何回繰り返すか指定する
- 「^」:行頭
- 「$」:行末
正規表現の例
正規表現の組み合わせを、見てみましょう。
ここでは、使用頻度の高い正規表現の例をいくつか挙げてみます。
携帯電話番号
^0[789]0-\d{4}-\d{4}$
意味:
「070, 080, 090のいずれか」(先頭)+「ハイフン」+「半角数字4桁」+「ハイフン」+「半角数字4桁」(終わり)
- 080-1234-5678:○
- 08012345678:×
- 000-12345678:×
郵便番号
^\d{3}-\d{4}$
意味:
「半角数字3桁」(先頭)+「ハイフン」+「半角数字4桁」(終わり)
- 123-4567:○
- 1234567:×
- 12-345:×
メールアドレス
^[a-zA-Z0-9-_\.]+@[a-zA-Z0-9-_\.]+$
意味:
「半角英数字と特定の記号」(先頭)+「アットマーク1つ」+「半角英数字と特定の記号」(終わり)
- abc123@abc.com:○
- a-b.c_d@a-b.c_d.com:○
- abc¥$@abc.com:×
特にメールアドレスは、規定を厳しめにするか緩めにするかによってパターンが異なります。
今回は緩めのパターンを例にしていますが、規定を厳しくする場合は、例えば以下のような調整をすることもあります。
- 文字制限を設定する
- @マークの後ろに使える記号を限定的にする
正規表現を言葉で表現するのは難しいものですが、概念や特徴、メタ文字の基本をおさえた上で例を見てみると、何となく想像できるのではないでしょうか。
まとめ
- 正規表現は、文字列の組み合わせを照合するためのパターン記法。
- 正規表現には、文字列を検索・置換・規定確認する機能がある。
- 正規表現は、メタ文字という特殊な文字から構成される。