今回は、”アンカー“について解説していきます。
量指定子や文字クラスについては別の記事で解説していますので、そちらを御覧ください。
目次
正規表現メタ文字アンカーとは?
アンカーとは、正規表現中で、特定の位置を意味します。
それ自体は文字をマッチングしないことが特徴です。
他の条件(量指定子・文字クラス)とセットで使います。
「~から始まり」「~で終わる」指定をすることが可能になります。
\A、\zがあります。
文字列の先頭、文字列の末尾
では、使い方の例を見ていきましょう。
\A (文字列の先頭)
例を見ていきましょう。
例) \A株式会社
- ソフトバンク株式会社 ✕
- 株式会社デンソー ○
今回は、文字列の先頭に「株式会社」があればマッチすることになります。
ソフトバンク株式会社の場合は、株式会社から始まっていないのでマッチしないことがわかります。
\z (文字列の末尾)
例を見ていきましょう。
例) 株式会社\z
- ソフトバンク株式会社 ○
- 株式会社デンソー ✕
今回は、文字列の末尾に「株式会社」があればマッチすることになります。
ソフトバンク株式会社の場合は、末尾が「株式会社」で終わっているのでマッチしますね。
\Aと\zを 組み合わせることで文字列の先頭から末尾まで 指定することができます。
例を見ていきましょう。
例) \A株式会社\z
- ソフトバンク株式会社 ✕
- 株式会社デンソー ✕
- 株式会社 ○
今回は、文字列の先頭から末尾までが「株式会社」の場合にマッチします。
株式会社以外の言葉がある場合はマッチしません。
先読み、後読み
検索単語の前後の条件を示すアンカーになります。
「直前(直後)に〜がある(ない)」
具体的には4種類あります。
通称 | 表記 | 意味 |
肯定先読み | (?=パターン) | その位置の直後にパターンにマッチする文字列がある |
否定先読み | (?!パターン) | その位置の直後にパターンにマッチする文字列がない |
肯定後読み | (?<=パターン) | その位置の直前にパターンにマッチする文字列がある |
否定後読み | (?<!パターン) | その位置の直前にパターンにマッチする文字列がない |
肯定先読みの例を見ていきましょう。
例) (?=Press)
- WordPress
こちらの場合は、直後に「Press」がある位置という表現のアンカーになります。
そのためdとPの間の位置がマッチすることになります。
パスワードの英数混合を判断する正規表現を考えてみよう
ここまで学習したことを踏まえて、パスワードの英数混合を判断するための正規表現を見ていきたいと思います。
/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i
または、
/\A(?=.*?[a-zA-Z])(?=.*?[\d])[\w]+\z/
どうでしょうか?上記の記述はどちらも同じ内容になります。
メタ文字が色々組み合わせられているので、難しく感じるかもしれません。
細かく分解して見ていきましょう。
分解すると以下のようになります。
- \A
- (?=.*?[a-z])
- (?=.*?[\d])
- [a-z\d]+
- \z
- i
一つずつ確認していきましょう。
- \A
こちらは、文字列の先頭を表現するアンカーでしたね。
- (?=.*?[a-z])
こちらは、その位置の直後に英字が出てくる位置を表現していることになります。
先程解説した肯定先読み、以前解説した量指定子や文字クラスを組み合わせています。
- (?=.*?[\d])
こちらは、その位置の直後に数字が出てくる位置を表現していることになります。
こちらも肯定先読み、量指定子や文字クラスを組み合わせています。
量指定子や文字クラスについては、以前解説している記事がありますのでそちらを御覧ください。
- [a-z\d]+
こちらは、英字か数字が1回以上繰り返されているを表現しています。
- \z
こちらは、文字列の末尾を表現するアンカーになります。
- i
こちらは、iオプションになります。
文字列の中にある大文字と小文字を区別しないオプションになります。
詳しくは解説しないため、気になる方は調べてみましょう。
まとめ/\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i
こちらを言語化してみると以下のようになります。
「任意の0回以上の文字列.*?と英字1文字[a-z]を条件とした、任意の先頭位置(?=)かつ任意の0回以上の文字列.*?と数字1文字[\d]を条件とした、任意の先頭位置(?=)から始まる英数字だけで構成された文字列」
今回の表現では一つでも記述が抜けると、英数混合にマッチさせることができなくなってしまいます。
気になる方は色々な表現を試してみましょう。
いかがだったでしょうか?
正規表現自体は、文字列の表現方法になります。
少しずつ理解度を上げていくことで苦手意識もなくなるかと思います。
この記事によって少しでも苦手意識がなくなってくれると嬉しいです。
最後までご覧頂きありがとうございました。
以前解説した関連記事も御覧ください。