Это невозможно.
Regex можно использовать для языков хомского типа-3 (обычный язык).
Однако ваш пример кода - язык Хомского типа-2 (контекстно-свободный язык).
Практически, как только вложены любые виды вложений (скобок), вы имеете дело с контекстно-свободными языками, которые не охватываются регулярными выражениями.
Существует в основном , никак не для определения within a pair of x and y
в регулярном выражении , так как требует, чтобы регулярное выражение имело некоторый вид стека, который он не (будучи функционально эквивалентным автомату конечных состояний).
Brandizzi предложила найти регулярное выражение, которое могло бы соответствовать хотя бы тривиальным случаям
Я на самом деле придумал этот (мучительно хакерский) шаблон регулярного выражения:
perl -pe 's/(?<=<td>)((?:(?:\{.*?\})*[^{]*?)*)(ReplaceMe)(.*)(?=<\/td>)/$1REPLACED$3/g'
Это правильно (sic!) совпадение для этих случаев:
<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td>
<td> ReplaceMe ${dontReplaceMeEither} </td>
<td> ${ dontReplaceMe } ReplaceMe </td>
<td> ReplaceMe </td>
И терпит неудачу с этим (вложение - это Хомский Тип-2, помните?;)) :
<td>${ ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} }</td>
И не может заменить несколько совпадений :
<td> ReplaceMe ReplaceMe </td>
<td> ReplaceMe ${dontReplaceMeEither} ReplaceMe </td>
Получение ведущей информации $
было сложной задачей.
Это и не дает Реджинальду / Регги постоянно падать при написании этого зверя.
ВНОВЬ: ЭКСПЕРИМЕНТАЛЬНО, НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЭТО В КОДЕКСЕ ПРОИЗВОДСТВА!
(… или я буду выслеживать вас, если мне когда-нибудь придется работать с вашим кодом / приложением;)