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

您缺少一个结束锚,并且您有一个 .*太多(在开始时):

^             # 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 回答