4

Angular 以外のプロジェクトで使用したいくつかの正規表現を使用して ng-pattern をテストし始めたところですが、正常に動作しました。しかし、ng-pattern を使用すると、機能しないようです。たとえば、少なくとも 1 つのアルファベットと 1 つの数字を含む 6 ~ 20 文字の文字列を正常にチェックする次の正規表現があります。

"^.*(?=.{6,20})(?=.*\d)(?=.*[a-zA-Z]).*$"

ただし、以下の Angular の例では、文字列が 20 文字を超えるとトリガーされないことを除いて、すべてが正常にチェックされます。

<div class="controls">
            <input type="text" ng-model="user.Password" id="Password" name="Password" title="Password" required ng-pattern="^/.*(?=.{6,20})(?=.*\d)(?=.*[a-zA-Z]).*$/" />
            <span ng-show="form.Password.$dirty && form.Password.$error.required">{{'_PasswordRequired_' | i18n}}</span>
            <span ng-show="form.Password.$dirty && form.Password.$error.pattern">{{'_PasswordLengthAndAlphanumeric_' | i18n}}</span>
        </div>

構文に何かエラーがありますか、それともこれが機能しない他の理由がありますか?

4

1 に答える 1

5

エンド アンカーがなく、1 つ .*多すぎます (最初に):

^             # Start of string
.*            # Match *any*  number of characters
(?=.{6,20})   # *Then* check that 6-20 characters follow
<snip>
.*            # *Then* match any number of characters anyway        
$             # until the end of the string

これはうまくいきます:

"^(?=.{6,20}$)(?=.*\d)(?=.*[a-zA-Z]).*$"

しかし、先読みの外で長さチェックを行う方が簡単です (そしてより明白です):

"^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$"

(これは、なぜそんなに低い上限を課すのかと私に尋ねさせます。たとえば、KeePass で生成されたパスワードは通常、少なくとも 30 文字の長さです)

于 2013-07-12T10:35:16.270 に答える