Негативный прогноз в Regex, похоже, не работает - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать Regex для извлечения субдомена из URL, который следует строгому шаблону. Я хочу сопоставлять только URL-адреса с указанными поддоменами , поэтому я использую отрицательный прогноз. Кажется, это работает во многих оценщиках регулярных выражений, но когда я запускаю в узле, обе строки совпадают. Вот код:

const defaultDomain = 'https://xyz.domain.com';
const scopedDomain = 'https://xyz.subdomain.domain.com';

const regex = /^https:\/\/xyz\.([^.]+(?!domain))\./
const matchPrefix1 = defaultDomain.match(regex);
const matchPrefix2 = scopedDomain.match(regex);

console.log(matchPrefix1);
console.log(matchPrefix2);

Ожидается: matchPrefix1 равно null, а matchPrefix2 приводит к совпадению, в котором первая группа захвата имеет значение «поддомен»

Факт: и matchPrefix1, и matchPrefix2 содержат данные, причем группы захвата возвращаются как «домен» и «поддомен» соответственно

Ссылка на регулярное выражение (работает!): https://regexr.com/42bfn

Ссылка на репл (не работает): https://repl.it/@tomismore/SpiffyFrivolousLaws

Что здесь происходит?

1 Ответ

0 голосов
/ 01 ноября 2018

Regexr показывает, что ваш код работает, потому что вы не добавили многострочный флаг. Это приводит к тому, что начало второй строки не соответствует ^, поэтому вся вторая строка игнорируется. Добавьте многострочный флаг, чтобы увидеть, что ваше регулярное выражение не работает.

Я бы использовал это регулярное выражение:

^https:\/\/xyz\.(?!domain)([^.]+)\.

Внесенное мною изменение заключается в перемещении детали [^.]+ после проверки (?!domain). Как правило, вы должны проверить (?!domain) сразу после сопоставления xyz\..

...