#javascript #regex #string-matching #positive-lookbehind
Вопрос:
Вот строка и предложение, которые я хочу сопоставить (извлечь).
let pigs = "X The animal 0000 I really dig X Above all others is the pig. 222 X Pigs are noble. Pigs are clever 3333, X Pigs are 5555 courteous.X However, Now and then, to break this 6666 rule, X One meets 7777 a pig who is a fool. X"
" Pigs are 5555 courteous."
Вот две версии моего кода. Когда я регистрируюсь на различных сайтах с проверкой регулярных выражений, это дает желаемое совпадение. Но когда я запускаю в консоли браузера, она выдает нуль. У меня последняя версия Chrome. Почему консоль браузера не выводит совпадение здесь?
pigs.match(/(?<=\X)[^\X]*5555[^\X]*(?=\X)/g);
pigs.match(/(?:\X)[^\X]*5555[^\X]*(?:\X)/g);
Комментарии:
1. Вам нужно избежать обратной косой черты в
pigs
строке, если вы хотите, чтобы они были буквальными.2. Попробуйте
console.log(pigs)
, и вы увидите, чтоX
превратилось вX
.3. Почему браузер автоматически удаляет обратные косые черты в каждой строке?
4. Обратная косая черта-это префикс escape. Он либо запускает escape-последовательность (например
n
, для новой строки), либо делает следующий символ буквальным.
Ответ №1:
Вы могли бы использовать следующий шаблон:
(?<=X)(?:.(?!X)) 5555. ?(?=X)
Что я изменил, так это: (?:.(?!X))
— которая не является группой захвата, и выражение соответствует одному или нескольким символам, за которыми не следует X
.
Кроме того, вы неправильно использовали [^\X]
— это просто отрицаемый класс, он будет соответствовать любому символу, отличному от
или X
.
Ниже приведен пример JS:
let pigs = "X The animal 0000 I really dig X Above all others is the pig. 222 X Pigs are noble. Pigs are clever 3333, X Pigs are 5555 courteous.X However, Now and then, to break this 6666 rule, X One meets 7777 a pig who is a fool. X"
let match = pigs.match(/(?<=X)(?:.(?!X)) 5555. ?(?=X)/g)
console.log(match)