[英]Java regex doesn't match
我有這個正則表達式:
#(?<=[^\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=?;");
請問有人有想法嗎?
執行以下操作:
public class Main {
public static void main(String[] args) {
// Tests
String[] sqls = {
"SELECT * FROM users WHERE username=?;",
"SELECT * FROM Users WHERE username=?;",
"SELECT * FROM `users` WHERE username=?;",
"SELECT * FROM `Users` WHERE username=?;"
};
for (String sql : sqls) {
System.out.println(sql.replace("`", "").replaceAll("(\\b[A-Z][a-z]+)|(\\b([a-z]+)\\b)", "`$0`"));
}
}
}
Output:
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
解釋:
\b
用於單詞邊界。[az]+
僅用於小寫字符。[AZ][az]+
表示大寫字母后跟小寫字母。|
用作or
。$0
用於整個匹配參數。如有任何疑問/問題,請隨時發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.