2017-04-20 91 views
1

我试图评估在个人ID文本字段对两个同步模式的字符串(图1):是否可以在AngularJS中使用双正则表达式(正则表达式)计算字符串?

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)

由此,形式的代码段如下所示:

<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> 

正如你所看到的,wha吨应该发生的是,每一个验证(长度和模式)进行评估。

的相关负责人片段看起来是这样的:

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或另一个regExp硬编码到ng模式组件中。但这不是最佳的,因为两者都需要共同努力。

是否有这样做的更好,“Angularier”的方式?我试图在regex101中重新构建正则表达式,但没有成功。

+1

尝试'/^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET] | [0-9] {7,8} \ [0-9] \([AZ] | [0-9]){2} [0-9 ])$ /;' –

+0

嗨Wiktor的,感谢您的评论, 只是想你的正则表达式,并得到了这一点: '无效的正则表达式:/ ^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET ] | [0-9] {7,8} \ [0-9] \([AZ] | [0-9]){2} [0-9])$ /:Unmatched') '' 狩猎这个流氓括号,我设法得到第一个条件工作(12345678A),但不是第二个。似乎是一个语法问题。 – wickedchild

+0

我刚刚复制你的。所以,在你身边找一个问题。也许你的第二个是['^ [0-9] {7,8} [0-9] [A-Z0-9] {2} [0-9] $'](https://regex101.com/ R/FrA28c/1)?那么你的正则表达式应该像['^([0-9] {8} [trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET] | [0-9] {7,8} [0-9] [A-Z0-9] {2} [0- 9])$'](https://regex101.com/r/ONPHJl/1)。不要从注释中复制粘贴,因此为了更好的外观,将垃圾字符插入这些文本中。 –

回答

0

我觉得现在的问题是,你在视图中使用的虚拟机。假设你正在使用的控制器在视图,控制器范围视图的范围,除非你正在使用别名

所以,你应该使用ng-pattern= "verificarId" instate的ng-pattern= "vm.verificarId"

+0

嗨贡萨洛, 我试过你的方法,但它也不工作。我测试打印JSON作为我填的表格,并与vm.verificarId我得到这个(注意“形式”): '{ “doNotMatch”:空, “错误”:空, “errorUserExists” :空, “registerAccount”:{}, “成功”:空, “dniValidate”:空, “$决心”:{ “$ stateParams”:{}, }, “形式”: { “dni”:“123456789” } }' 当我删除“vm”时,表单甚至没有出现在JSON日志中。 – wickedchild

相关问题