🤦♂️
[Java] 半角記号すべての正規表現
経緯
Spring BootでREST APIの開発をしていて、リクエストを@Patternのアノテーションをつかってバリデーションしようとしていてエラーでつまづいてしまいました。
少なくとも1文字以上の小文字、大文字、数字、記号を含む8文字以上 をマッチさせたく以下のように書いていました。
@Pattern(regexp="^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@[-`{-~])[!-~]{8,}$")
すると以下のエラーが発生していました。
javax.validation.ValidationException: HV000032: Unable to initialize org.hibernate.validator.internal.constraintvalidators.bv.PatternValidator
正規表現の書き方がよろしくなくてエラーになっているっぽいということですが、こちらの正規表現はNode.jsで以前に実績があったためそんなはずは、、と思いつつも調べたところ、記号の箇所でエラーがでていてグループを表現する[]の中に[がエスケープされずに入っているのかだめなようで、エスケープしないといけないのですが\[としようとすると
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
というエラーになってしまい、Javaでバックスラッシュを文字列として表すには\\とする必要があるということでした。
参照: Java の正規表現でぶつかった
最終的に
@Pattern(regexp="^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@\\[-`{-~])[!-~]{8,}$")
このように記述することでエラーなく正規表現を記述することができました。
Discussion