Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

カスタム属性を作ってクライアントサイドの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

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

ソース引用元

https://github.com/microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/RegularExpressionAttribute.cs

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away