JavaScript регулярное выражение содержит, но не соответствует точно - PullRequest
0 голосов
/ 18 января 2020

У меня есть список названий mov ie и регулярное выражение для диапазона дат между 2010 и 2020 годами. Когда я фильтрую список, регулярное выражение не соответствует строке, содержащей искомый шаблон. Как я могу проверить, содержит ли строка регулярное выражение, но не соответствует ли она точно?

const YEARS_BETWEEN_2010_AND_2020_REGEX = /^(20\d|201\d|2020)$/;
const MOVIE = ['Some Movie (2013)', 'Some Other Movie (2010)'];

MOVIE.filter((movie) => {
    YEARS_BETWEEN_2010_AND_2020.test(movie) // false for all
})

Ответы [ 2 ]

1 голос
/ 18 января 2020

Шаблон, который вы пробовали (20\d|201\d|2020), также будет соответствовать 200 или 209.

Диапазон от 2010 до 2020 можно сопоставить, используя:

\b20(?:1[0-9]|20)\b

Regex demo

Вместо использования якорей можно использовать границы слов \b в качестве якорей ^ и $ для подтверждения начала и конца строки.

Вы не нужно использовать return, если вы опустите фигурные скобки в коде.

const YEARS_BETWEEN_2010_AND_2020_REGEX = /\b20(?:1[0-9]|20)\b/;
const MOVIE = ['Some Movie (2013)', 'Some Other Movie (2010)'];
console.log(MOVIE.filter((movie) => YEARS_BETWEEN_2010_AND_2020_REGEX.test(movie)));

Другим вариантом получения более точного c соответствия является использование группы захвата, и с обеих сторон соответствуют любому символу, кроме di git или установить начало или конец строки

(?:^|\D)20(?:1[0-9]|20)(?:$|\D)

или использовать отрицательный вид сзади (который пока еще широко не поддерживается всеми браузерами), утверждая, что слева

(?<!\d)(?:20(?:1[0-9]|20))(?!\d)
не указано di git
1 голос
/ 18 января 2020

Удалите начальные (^) и конечные ($) границы из регулярного выражения. Включение их обоих означает, что строка от начала до конца должна иметь шаблон, а не просто включать его.

const YEARS_BETWEEN_2010_AND_2020_REGEX = /20(?:1\d|20)/;
const MOVIE = ['Some Movie (2013)', 'Some Other Movie (2010)'];

const result = MOVIE.filter((movie) =>
  YEARS_BETWEEN_2010_AND_2020_REGEX.test(movie) // false for all
);

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