LoginSignup
0

More than 3 years have passed since last update.

RegularExpressionで正規表現の否定を使いたかった話

Posted at

結果だけ言うとできない。
なのでカスタム属性を作るなりめんどくさい正規表現を組むなりの手法を使う必要がある。

カスタム属性を作ってクライアントサイドのjs構築まで手を出そうとするには時間コストが取れなかったので
今回はめんどくさい正規表現で逃れることにした。
この際、RegularExpressionAttributeの仕様でちょっと躓いたのでこの記事を書くことに。

System.ComponentModel.DataAnnotations.RegularExpressionAttributeは
patternパラメータに設定した正規表現にマッチしない場合、
ErrorMessageに設定したメッセージをエラーとして設定してくれる属性となっている。

要件

数字のみ6桁以上の文字列はNGとして弾く

最初に書いた正規表現

^.{1,5}$|\D
1. 5桁まではなんでもOK
2. 数字以外が現れた場合はOK

としたかったが、結果NG。
これは何故かというとRegularExpressionAttributeのIsValidメソッドの判定以下のようになっているため。

RegularExpressionAttribute.csより一部抜粋
Match m = this.Regex.Match(stringValue);
return (m.Success && m.Index == 0 && m.Length == stringValue.Length);

つまり全文マッチしていないと許されないらしい。

なので全パターン書く

(^.{1,5}$|^[\D]+[\d]*.*$|^[\d]*[\D]+.*$)

  1. 5桁まではなんでもOK
  2. 数字が現れる前に数字以外が存在していればOK
  3. 数字が現れた後に数字以外が存在していればOK

この考え方で正しく通った。

ソース引用元

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0