正则表达式在有效和无效之间交替

时间:2018-07-03 11:07:56

标签: javascript regex

我很确定这是我做错的事情,可以用另一双眼睛指出毫无疑问的代码错误。

我有一个组件位于mat-tab内部,并且是延迟加载的。在组件中,我有一个反应式的字段,如下所示。

我已经在environment.ts中定义了一个电子邮件验证器模式

export const environment = {
  ...
  validators: {
    // tslint:disable-next-line:max-line-length
    email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/gi
  }
}

窗体是在组件构造函数中定义的:

this.form = this.fb.group({
  ...
  'primary_contact': this.fb.group({
    'name': [''],
    'email': ['', { validators: [Validators.required, Validators.pattern(environment.validators.email)], updateOn: 'blur' }],
    'phone': ['']
  }),
  ...
});

然后使用输入变量在ngOnInit中填充表单:

@Input() tenant: Tenant;

ngOnInit() {
  this.form.patchValue({
    ...this.tenant
  });
  this.form.updateValueAndValidity();
}

最后在模板中,我有以下内容:

<div fxFlex fxLayout="row wrap" fxLayout.xs="column wrap" fxLayoutGap="24px grid" formGroupName="primary_contact”>
  ...
  <div fxFlex="50">
    <mat-form-field class="full-width">
      <mat-label>Primary Contact Phone</mat-label>
      <input matInput type="tel" formControlName="phone" />
    </mat-form-field>
  </div>
  ...
</div>
<mat-divider></mat-divider>
<div class="form-actions">
  <button mat-flat-button color="primary" [disabled]="form.invalid" (click)="onSaveChanges()">Save changes</button>
  <a mat-button [routerLink]="['../../']">Cancel</a>
</div>

由于我的问题,当组件加载表单时,表单可以是有效或无效,并且在两个选项卡之间切换时,该字段将在有效/无效状态之间切换。

任何人都可以看到我在做什么错吗?

我有一个stackblitz here,它复制了我所遇到的问题。

已更新

因此,在查看了Angular电子邮件验证程序并剥离了示例之后,我发现以下内容似乎表明正则表达式本身存在问题。请参见下面的两个代码片段,如果您使用我的正则表达式运行它们,而第二个片段与来自角度验证器的正则表达式一起运行,则会得到不同的结果

从上方使用正则表达式

const re1 = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/gi);
for (let i = 0; i < 10; i++) {
  console.log(re1.test('test@gmail.com'));
}

使用来自Angular电子邮件验证程序的正则表达式

const re2 = new RegExp(/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/);
for (let i = 0; i < 10; i++) {
  console.log(re2.test('test@gmail.com'));
}

所以要更新这个问题,为什么我的正则表达式测试在有效和无效之间交替?

0 个答案:

没有答案