У меня есть это регулярное выражение:
#(?<=[^\w`"\[?:]|^)[a-z_][a-z0-9_]*(?=[^\w`"(\]]|$)#Di
, и я пытаюсь сделать синтаксис SQL красивым. Например, из "SELECT * FROM users WHERE username = ?;" to
SELECT * FROM `users` WHERE `username`=?;
Это регулярное выражение, соответствующее всем словам, которое не содержит обратных галочек. И в группе совпадений я проверяю, совпадает ли слово в верхнем регистре. Если это правда, то это слово пропущено. И другие слова добавляются в кавычки. Моя проблема в том, что регулярное выражение ничего не соответствует. У меня есть аналогичный код в PHP, и он там работает.
function tryDelimite(string $s): string {
return preg_replace_callback('#(?<=[^\w`"\[?:]|^)[a-z_][a-z0-9_]*(?=[^\w`"(\]]|$)#Di', function (array $m): string {
return strtoupper($m[0]) === $m[0] ? $m[0] : delimite($m[0]);
}, $s);
}
function delimite(string $name): string {
return '`' . str_replace('`', '``', $name) . '`';
}
echo tryDelimite("SELECT * FROM users WHERE username=?;");
У кого-нибудь есть идея, пожалуйста?