regex Java正则表达式不匹配

zsbz8rwp  于 2022-12-01  发布在  Java
关注(0)|答案(1)|浏览(203)

我有一个正则表达式:

#(?<=[^\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=?;");

有谁有主意吗?

vuktfyat

vuktfyat1#

请按以下步骤操作:

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`"));
        }
    }
}

输出:

SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;
SELECT * FROM `users` WHERE `username`=?;
SELECT * FROM `Users` WHERE `username`=?;

说明:

1.sql.replace(“`",“”) 删除所有已经存在的反勾号(通过用空字符串替换它们)以避免重复。

  1. \b用于字边界。
  2. [a-z]+仅适用于小写字符。
  3. [A-Z][a-z]+表示大写字母后跟小写字母。
  4. |被用作or
  5. $0用于整个匹配参数。

相关问题