🤦‍♂️

[Java] 半角記号すべての正規表現

2023/03/11に公開

経緯

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