Regex.test (value) возвращает true, когда зарегистрировано, но false в операторе if - PullRequest
0 голосов
/ 11 января 2020

Я заметил что-то странное с моим кодом. У меня есть регулярное выражение для проверки почтовых индексов Великобритании, оно использует группы захвата и работает нормально, если только не в операторе if. Код для проверки находится в классе валидатора, которому передается список узлов HTML со всеми полями из формы.

Например, когда я использую его в теге pattern на входе HTML поле это действует так, как вы ожидаете. Как и когда я console.log(regex.test(field.value)). Тем не менее, когда я помещаю его в выражение if, оно каждый раз кажется неудачным.

Регулярное выражение выглядит следующим образом:

/\b([a-zA-Z]{1,2}[0-9]{1,2}[a-zA-Z]?){1}( |-)?([0-9]{1,2}[a-zA-Z]{1,2}){1}\b/

Поле ввода выглядит следующим образом:

<input required pattern="\b([a-zA-Z]{1,2}[0-9]{1,2}[a-zA-Z]?){1}( |-)?([0-9]{1,2}[a-zA-Z]{1,2}){1}\b" inputmode="text" class="form-field" type="text" name="postcode" id="contactPostcode" placeholder="Postcode eg NW2 8BZ" />

Код для проверки следующий:

validate(fields)

// ... omitted ... //

let errors = [];

const postcodeRegex = /\b([a-zA-Z]{1,2}[0-9]{1,2}[a-zA-Z]?){1}( |-)?([0-9]{1,2}[a-zA-Z]{1,2}){1}\b/;

postcodeRegex.lastIndex = 0;

for (let field of fields) {

    if(field.name === 'postcode') {
        console.log(postcodeRegex.test(field.value))
        if(!postcodeRegex.test(field.value)) {
            errors.push({
                field: field.getAttribute('name'),
                error: 'Illegal character detected'
            });
            continue;
        }
    }

}

Проверка console.log возвращает значение true, однако проверка оператора if каждый раз возвращает значение false, и я не понимаю, почему две идентичные проверки будут давать разные результаты, есть ли у кого-нибудь совет? Я предполагаю, что что-то происходит над моей головой здесь.

Спасибо

Редактировать для пояснения: лог консоли true, но оператор if все еще выполняется

1 Ответ

2 голосов
/ 11 января 2020

Согласно документации https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

Как и в случае с exe c () (или в сочетании с ним), test () вызывался несколько раз для одного и того же глобального Экземпляр регулярного выражения будет двигаться дальше предыдущего

Так вот почему во второй раз вы получите false.

Попробуйте это:

var res = postcodeRegex.test(field.value);
console.log(res)
        if(!res) {
...