Javascript 在AngularJS中是否可以使用双正则表达式(regex)计算字符串?

Javascript 在AngularJS中是否可以使用双正则表达式(regex)计算字符串?,javascript,angularjs,regex,Javascript,Angularjs,Regex,我试图根据personal ID文本字段中的两个同时模式计算字符串(图1): 此字段用于用户输入其个人西班牙语(DNI)或葡萄牙语(Cartão de cidadão)国家识别号,其目的是立即评估这两种模式,而不考虑区域设置(网站使用西班牙语、英语和葡萄牙语) 这些模式应该是: 西班牙文:/^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i(即12345678A) 葡萄牙语:/^[0-9]{7,8}\[0-9]\([A-Z]{0-9]){2}[0-9]$/(即0

我试图根据personal ID文本字段中的两个同时模式计算字符串(图1):

此字段用于用户输入其个人西班牙语(DNI)或葡萄牙语(Cartão de cidadão)国家识别号,其目的是立即评估这两种模式,而不考虑区域设置(网站使用西班牙语、英语和葡萄牙语)

这些模式应该是:

  • 西班牙文:
    /^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i
    (即12345678A)
  • 葡萄牙语:
    /^[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>
    
    这是行不通的。这种模式似乎被忽视了。我尝试在两个regexp条件之间插入括号,例如:

    /(^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i)|(/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$)/
    
    但是抛出一个语法错误我唯一能够部分工作的方法是将一个或另一个regExp硬编码到ng模式组件中。但这并不是最优的,因为两者需要共同努力


    有没有更好的“角度化”的方法?我尝试在regex101中再次重建regex,但没有成功。

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

    因此,您应该使用
    ng pattern=“verificarId”


    安装
    ng pattern=“vm.verificarId”

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

    因此,您应该使用
    ng pattern=“verificarId”


    安装
    ng pattern=“vm.verificarId”

    Try
    /^([0-9]{8}[trwagmyfpdxbnjzqvhlckettrwagmyfpdxbnjzzqvhlcket]\[0-9]{7,8}\[0-9]\([A-Z][0-9]){2}[0-9])$/
    Hi Wiktor,感谢您的评论,刚刚尝试了您的正则表达式,得到以下结果:
    无效正则表达式:/^([0-9]{8}[trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET‌​]|[0-9]{7,8}\[0-9]\(‌​[A-Z]|[0-9]){2}[0-9]‌​)$/: Unmatched')”
    找到了那个错误的括号,我设法使第一个条件起作用(12345678A),但不是第二个。似乎是语法问题。我只是复制了你的。所以,在你这边找到一个问题。也许你的第二个问题是?那么你的正则表达式应该是这样的。不要复制注释中的粘贴,所以在这些文本中插入垃圾字符以获得更好的外观。@Wiktor Stribiżew是的,我知道。我一次只写一个字符,但仍然可以“这两种方法都不起作用。目前,这两种方法中只有一种有效,而且似乎完全取决于表达式的位置。OR似乎没有被识别。是的,似乎你需要的东西不能在一个正则表达式中完成。请尝试
    /^([0-9]{8}[trwagmyfpdxbnjzqvhlckettrwagmyfpdxbnjzqvhlcket]|[0-9]{7,8}\[0-9]([A-Z]}[0-9]){2]$/;
    Hi Wiktor,感谢您的评论,刚刚尝试了您的正则表达式,得到了以下结果:
    无效正则表达式:/^([0-9]{8}[trwagmyfpdxbnjzsqvhlcketTRWAGMYFPDXBNJZSQVHLCKET‌​]|[0-9]{7,8}\[0-9]\(‌​[A-Z]|[0-9]){2}[0-9]‌​)$/: Unmatched')”
    找到了那个错误的括号,我设法使第一个条件起作用(12345678A),但不是第二个。似乎是语法问题。我只是复制了你的。所以,在你这边找到一个问题。也许你的第二个问题是?那么你的正则表达式应该是这样的。不要复制注释中的粘贴,所以在这些文本中插入垃圾字符以获得更好的外观。@Wiktor Stribiżew是的,我知道。我一次只写一个字符,但仍然可以“这两种方法都不起作用。目前这两种方法中只有一种有效,而且似乎完全取决于表达式的位置。OR似乎不被识别。是的,似乎你需要的东西不能在一个正则表达式中完成。嗨,Gonzalo,我试过你的方法,但它也不起作用。我在填写表单时测试了打印JSON,结果对于vm.verificarId,我得到了这个(注意“form”):
    {“doNotMatch”:null,“error”:null,“errorUserExists”:null,“registerAccount”:{},“success”:null,“dniValidate”:null,$resolve:{“$stateParams”:{},},“form”:{“dni”:“123456789”}
    当我删除“vm”,表单甚至没有出现在JSON日志中。嗨,Gonzalo,我尝试了你的方法,但它也不起作用。我在填写表单时测试了打印JSON,使用vm.verificarId我得到了这个结果(注意“表单”):
    {“doNotMatch”:null,“error”:null,“errorUserExists”:null,“registerAccount”:{},“success”:null,“dniValidate”:null,“$resolve”:{“$stateParams”:{},},“form”:{“dni”:“123456789”}
    当我删除“vm”时,表单甚至没有出现在JSON日志中。
    /(^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i)|(/^[0-9]{7,8}\[0-9]\([A-Z]|[0-9]){2}[0-9]$)/