是否可以在AngularJS中使用双正则表达式(正则表达式)计算String?

时间:2017-04-20 13:38:25

标签: javascript angularjs regex

我正在尝试针对个人ID文本字段中的两个同时模式评估字符串(图1):

Fig. 1

此字段供用户输入他的个人西班牙语(DNI)或葡萄牙语(Cartãodecidadão)国家识别号,其目的是同时评估这两种模式,而不是关心语言环境集(网站是用西班牙语,英语和葡萄牙语。)

这些模式应该是:

  1. 西班牙语:/^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i(即12345678A)
  2. 葡萄牙语:/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$/(即04521225)
  3. 有了这个,表格的代码片段如下:

    <input type="text" name="field_dni"
        class="form-control form-control-400" id="field_dni"
        ng-model="vm.form.dni" 
        ng-minlength=9 
        ng-maxlength=9 
        ng-pattern= "vm.verificarId" />
    <div ng-show="verificarForm.field_dni.$invalid">
        <p class="help-block"
            ng-show="verificarForm.field_dni.$error.pattern"
            translate="verificar.validation.pattern">The pattern entered is 
            incorrect
        </p>    
        <p class="help-block"
            ng-show="verificarForm.field_dni.$error.required"
            translate="verificar.validation.required">This field is required.
        /p>
        <p class="help-block"
            ng-show="verificarForm.field_dni.$error.minlength"
            translate="verificar.validation.minlength">This field is required to 
            be exactly 9 characters long
        </p>        
        <p class="help-block"
            ng-show="verificarForm.field_dni.$error.maxlength"
            translate="verificar.validation.maxlength">This field is required to 
            be exactly 9 characters long
        </p>
    

    如您所见,应该发生的是每个验证(长度和模式)都要进行评估。

    相关的控制器代码段如下所示:

    function ValidateController($scope, Principal, ValidateService,  $state) {
        var vm = this;
        vm.verificarId= /^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i|/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$/;
    

    这不起作用。这种模式似乎被忽略了。我试过在两个正则表达式条件之间加上括号,例如:

    /(^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i)|(/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$)/
    

    但抛出语法错误。 我设法让这部分工作的唯一方法是将一个regExp或另一个硬编码到ng-pattern组件中。但这并非最佳,因为两者都需要协同工作。

    有没有更好的“Angularier”方式呢?我试图在regex101中再次重建正则表达式,但没有成功。

1 个答案:

答案 0 :(得分:0)

我认为问题在于您在视图中使用vm。假设您在该视图中使用该控制器,则控制器范围是视图的范围,除非您使用别名

所以你应该使用ng-pattern= "verificarId"

ng-pattern= "vm.verificarId"的实例