Angular регулярное выражение для чисел дает истину только для четной длины чисел - PullRequest
0 голосов
/ 09 апреля 2020

Я использую Angular9 и пытаюсь проверить, является ли введенный номер номером или адресом электронной почты или идентификатором. Но при попытке проверить числа он дает true для нечетной длины чисел и false для четной длины чисел.

Вот мой код:

readonly patterns = {
    numbersOnly: /^[0-9]*$/gm,
    emailRegex: /\S+@\S+\.\S+/gm,
    numberRegex: /^\d+$/gm,
    idRegex: /^(\d{13}-\d{1,}100)?$/gm
  };

  patternOutput = {
    numbersOnly: false,
    emailRegex: false,
    numberRegex: false,
    idRegex: false
  };

  onInputChange(str: string) {
    console.log('=====',str,'=====');
    const numberOnlyRegex = this.patterns.numbersOnly;
    const emailRegex = this.patterns.emailRegex;
    const numberRegex = this.patterns.numberRegex;
    const idRegex = this.patterns.idRegex;


    this.patternOutput.numbersOnly=numberOnlyRegex.test(str);
    console.log('numbersOnly=>',this.patternOutput.numbersOnly);

    this.patternOutput.emailRegex=emailRegex.test(str);
    console.log('emailRegex=>',this.patternOutput.emailRegex);

    this.patternOutput.numberRegex=numberRegex.test(str);
    console.log('numberRegex=>',this.patternOutput.numberRegex);

    this.patternOutput.idRegex=idRegex.test(str);
    console.log('idRegex=>',this.patternOutput.idRegex);
  }

Вот тот же рабочий код https://stackblitz.com/edit/angular-qmhfvf

Одна вещь, которую я заметил, когда проверил сформированный объект регулярного выражения: enter image description here enter image description here

Здесь я вижу, что есть ключ с именем lastIndex, значение которого в 1-м объекте равно 0, а во 2-м объекте - 8

1 Ответ

0 голосов
/ 09 апреля 2020

Избавьтесь от флага g таким образом, чтобы регулярное выражение не пыталось сопоставить bast с последним индексом, в котором оно было ранее.

g позволяет ему запускаться несколько раз через одну и ту же строку найти все спички. Следовательно, почему вы видите, что он соответствует только всем другим входным данным.

  readonly patterns = {
    numbersOnly: /^[0-9]*$/m,
    emailRegex: /\S+@\S+\.\S+/m,
    numberRegex: /^\d+$/m,
    idRegex: /^(\d{13}-\d{1,}100)?$/m
  };

Когда он совпадает, он устанавливает последний индекс в конец, но когда он не совпадает, он сбрасывает последний индекс, поэтому Следующая попытка работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...