はじめに
Djangoで正規表現のバリデーションを作成していて、混乱したところについて記述しました。
RegexValidateErrorとは
valueがどのようなときにエラーがでるのかで混乱しました。
公式ドキュメントより、以下の記述があります。
RegexValidator は、与えられた value を指定された正規表現で re.search() で検索します。デフォルトでは、一致が 見つからない 場合に message と code を持つ ValidationError を発生させます。
(参考:https://docs.djangoproject.com/ja/5.1/ref/validators/)
ここから、指定した正規表現とvalueが一致しないときにエラーが出るということがわかります。
inverse_match を True に設定することで、動作を逆にできます。この場合、一致が 見つかった ときに ValidationError が発生します。
(参考:https://docs.djangoproject.com/ja/5.1/ref/validators/)
inverse_matchをつけると指定した正規表現とvalueが一致するときにエラーが出ることになります。文章に直すと否定がない分こちらの方が好みです。
例:全角数字の制限
例えば、電話番号など半角数字で入力してほしいものを全て全角数字で入力されている場合、どのようなバリデーションになるでしょうか。
以下のように実装できます。
RegexValidator(r'^[^0-9]+$', '全角数字は使用できません。')
使用した記号のおさらい(参考:https://www.megasoft.co.jp/mifes/seiki/meta.html)
記号 | 意味 | 例 |
---|---|---|
^ | 行頭 | 「^あ」 → 「あ」から始まる |
[^〜] | ~に含まれない1文字 | [^あいう] → 「あ」「い」「う」以外の1文字 |
+ | 直前のものを1回以上 | 「あ+」 → 「あ」を1文字以上 「あ」の前には何が入っていても良い |
$ | 行末 | 「あ$」 → 最後の文字が「あ」 |
指定した正規表現と一致しないときにエラーがでるので
正規表現は通したいvalueについて書くことになります。
全角文字の制限を行う場合、通したいvalueは全て全角の数字で書かれていない文字列です。そこで「全て全角の数字で書いている」に否定をつけているんですね。
まとめ
以上、短いですがRegexValidatorと正規表現についてでした。「指定した正規表現と一致しないときにエラーがでる」をとりあえず覚えます。記事も結局ウンウン悩んで書きました。