Я пишу метод для извлечения определенных данных из строки запроса SQL, и мне нужно регулярное выражение сопоставлять любое слово внутри фигурных скобок ТОЛЬКО, когда оно появляется вне одинарных кавычек. Мне также нужно учесть вероятность экранированных (предшествующих обратной косой черты) кавычек, а также экранированных обратной косой черты.
В следующих примерах мне нужно, чтобы регулярное выражение совпадало с {FOO}, а не {BAR}:
blah blah {FOO} blah 'I\'m typing {BAR} here with an escaped backslash \\'
blah blah {FOO} 'Three backslashes {BAR} and an escaped quote \\\\\\\' here {BAR}'
Я использую preg_match в PHP, чтобы получить слово в фигурных скобках (в данном случае "FOO"). Вот строка с регулярным выражением, которая у меня есть:
$regex = '/' .
// Match the word in braces
'\{(\w+)\}' .
// Only if it is followed by an even number of single-quotes
'(?=(?:[^\']*\'[^\']*\')*[^\']*$)' .
// The end
'/';
Моя логика заключается в том, что, поскольку единственное, что я анализирую, это допустимая строка SQL (помимо добавленной скобки), если за набором скобок следует четное число не -экранированные кавычки, то они должны быть вне кавычек.
Регулярное выражение, которое я предоставил, является на 100% успешным, ИСКЛЮЧЕНИЕМ для учета экранированных кавычек. Мне просто нужно убедиться, что перед совпадением в кавычках нет нечетного числа обратных слешей, но, судя по всему, я не могу передать это в RegEx. Любой берущий?