Регулярное выражение, заменяющее текст, если ему не предшествуют обратные косые черты без использования look-behind

#regex #regex-group #regexp-replace

#регулярное выражение #регулярное выражение-группа #регулярное выражение-заменить

Вопрос:

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

Примечание: я хочу избегать просмотра вперед / назад, поскольку Safari его не поддерживает

Живой пример: https://regex101.com/r/mDGs3C/1

 Welcome {{ PLAYER_NAME }} to the event
 

используя подстановку, это должно отображать

 Welcome Richard to the event
 

Для этого я использовал следующее регулярное выражение, которое, похоже, работает правильно.

/{{s*PLAYER_NAMEs*}}/gm

Однако я также хочу, чтобы была возможность экранирования, поэтому следующее

 Welcome {{ PLAYER_NAME }} to the event, you can use tags in here such as \{{ PLAYER_NAME }}
 

Я хочу вывести как …

 Welcome Richard to the event, you can use tags in here such as {{ PLAYER_NAME }}
 

Итак, я попытался использовать следующее в начале моего регулярного выражения, чтобы указать, что я не хочу, чтобы оно совпадало, если оно содержит двойную обратную косую черту.

 /[^\]{{s*PLAYER_NAMEs*}}/gm
 

Это ПОЧТИ работает, однако в некоторых сценариях оно отсекает последнюю букву предыдущего слова, взгляните на мой пример, чтобы увидеть, что e отсекается от слова welcome

https://regex101.com/r/mDGs3C/1

Комментарии:

1. Вы уверены, что вам не нужно избегать завитушек? ie [^\]{{s*PLAYER_NAMEs*}} ?

Ответ №1:

Захватите не-косые черты и поместите их обратно в замену:

Операция Параметр
Поиск ([^\]){{s*PLAYER_NAMEs*}}
Заменить $1 Richard

Комментарии:

1. Это работает отлично, спасибо! это был просто случай добавления его в свою собственную группу, а затем убедиться, что я использую это при замене 🙂