我有一个正则表达式:
#(?<=[^\w`"\[?:]|^)[a-z_][a-z0-9_]*(?=[^\w`"(\]]|$)#Di
并且我试图使SQL语法更美观。例如,从“SELECT * FROM users WHERE username=?;“到
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=?;");
有谁有主意吗?
1条答案
按热度按时间vuktfyat1#
请按以下步骤操作:
输出:
说明:
1.sql.replace(“`",“”) 删除所有已经存在的反勾号(通过用空字符串替换它们)以避免重复。
\b
用于字边界。[a-z]+
仅适用于小写字符。[A-Z][a-z]+
表示大写字母后跟小写字母。|
被用作or
。$0
用于整个匹配参数。