はじめに
webサービスやスマホアプリを開発されている方ならログインやユーザーの新規登録でからなず必要となる正規表現について勉強したのでアウトプットとして記事にしたいと思います。
正規表現とは
??「文字列の集合を一つの文字列で表現する方法。」
me「は?」
勉強を始めて最初の感想でした。
どういうことかというと
パスワードが以下の条件だとします。
大文字含む英数字8文字以上20文字以下
この条件を一つの文字列で表現したものになります。
必ず覚えたい正規表現
文字 | 意味 |
---|---|
\d | 半角数字1文字 |
[ab] | a~z までのアルファベット |
{n, m} | 直前の文字が n 文字以上 m 文字以下 |
{n} | 直前の文字が n 文字 |
? | 直前の文字が 0 or 1 個 |
. | 任意の文字1文字 |
-
| 直前の文字が1文字以上
-
| 直前の文字が0文字以上
[^AB] | A, B ではない任意の1文字
メタ文字
メタ文字とは特殊な意味を持つ文字のことです。
どんなものがあるかみてみましょう
メタ文字 | 説明 |
---|---|
|多目的に使う一般的なエスケープ文字 | |
^ | 検索対象の始まりを言明 |
$ | 検索対象の終わりあるいは終端の改行文字の前 |
. | 改行を除く全ての文字にマッチ |
[ | 文字クラスの定義の開始 |
] | 文字クラスの定義の終了 |
| | 選択枝の開始 |
( | サブパターンの開始 |
) | サブパターンの終了 |
? | 0 or 1 回マッチ |
* | 0 回以上の繰り返し |
+ | 1 回以上の繰り返し |
{ | 最小 / 最大を指定する量指定子の開始 |
} | 最小 / 最大を指定する量指定子の終了 |
※メタ文字をただの文字として扱いたい場合はエスケープ文字( \
)を前につける必要があります。
文字クラス
文字クラスとは[]
で囲まれたものです。
汎用的な文字クラスは以下になります。
文字 | 意味 |
---|---|
\w | [a-zA-Z0-9]と同じ |
\W | [^a-zA-Z0-9]と同じ※ |
\s | 任意のから文字 |
\S | 空白以外の文字 |
\d | [0-9]と同じ |
\D | [^0-9]と同じ※ |
※文字クラスの中では^
は否定の意味になります。
メタ文字の意味とは異なるので注意してください。
練習
郵便番号
定義は3文字の数字-4文字の数字とする
/^[\d]{3}-[\d]{4}$/
^
は文字列の先頭を表します。
[\d]
は0〜9の数字を表し、{3}
は直前の文字(ここでは数字)が3回繰り返されることを意味します。
&
は文字列の先頭を意味します。
メールアドレス
/^[\w\-\._]+@[\w\-\._]+\.[A-Za-z]+$/
\w
は[a-zA-Z0-9]と同じ意味で半角大小英数字を意味します。
\-\.
は-
と.
が特殊文字なので\
でただの文字として扱えるようにします。
+
は直前の文字が1文字以上という意味です。
パスワード
今回のパスワードの構成としては大小英数字を必ず1文字以上は含む8〜100文字にします。
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[\w]{8,100}$/
これを理解するには前方参照
と最短マッチ
について知っていなければなりません。
前方参照は(?=)
の部分に当たります。
例として
AA(?=BB)
というパターンで検索します。
前方参照によりマッチする条件の文字列は
AAが前方にあるBBという文字になります。
AABB
AACBB
AAABB
という3つの文字列があったとして上のパターンにマッチするのは
AABB
AAABB
になります。
また最短マッチは.*?
の部分になります。
正規表現は普通に行うと最長マッチというものになります。
<tr><td>boom</td></tr>
という文字列があったとしてhtmlタグだけ取得したいとします。
/<.*>/
というパターンで確認すると
<tr><td>boom</td></tr>
が結果として返ってきてしまいます。
これは最長マッチの特性で一度目の>
で区切られず一番最後まで検索してしまっているのが問題です。
一度目の>
で区切るには
/<.*?>/
と?
を加えてあげるだけでいけます。
これで検索すると
<tr>
が返ってきます。
ここからが本題です。
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[\w]{8,100}$/
は前方参照が文字列のはじまりを意味する^
なのでa〜z、A〜Z、0〜9のいずれかから始まり大小英数字をそれぞれ1文字以上含む8〜100文字以内の文字列とすることができます。