JS регулярное выражение положительный внешний вид не соответствует

#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)