Java 正则表达式不匹配
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)", "`[=10=]`"));
}
}
}
输出:
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
解释:
- sql.replace("`", "") 删除所有反引号(通过用空字符串替换它们),如果它们已经存在以避免重复它们。
\b
用于单词边界。
[a-z]+
仅适用于小写字符。
[A-Z][a-z]+
表示大写字母后跟小写字母。
|
用作 or
.
[=17=]
用于整个匹配参数。
如有任何问题,请随时发表评论 doubt/issue。
我有这个正则表达式:
#(?<=[^\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)", "`[=10=]`"));
}
}
}
输出:
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
解释:
- sql.replace("`", "") 删除所有反引号(通过用空字符串替换它们),如果它们已经存在以避免重复它们。
\b
用于单词边界。[a-z]+
仅适用于小写字符。[A-Z][a-z]+
表示大写字母后跟小写字母。|
用作or
.[=17=]
用于整个匹配参数。
如有任何问题,请随时发表评论 doubt/issue。