Java regex不匹配

问题描述 投票:0回答:1

我有这个正则表达式:

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

有人有主意吗?

java regex pattern-matching matcher
1个回答
0
投票

执行以下操作:

public class Main {
    public static void main(String[] args) {
        String sql = "SELECT * FROM Users WHERE username=?;";
        System.out.println(sql.replace("`", "").replaceAll("(\\b[A-Z][a-z]+)|(\\b([a-z]+)\\b)", "`$0`"));
    }
}

输出:

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

说明:

  1. sql.replace(“`”,“”)替换所有反引号(如果它们已经存在,以避免重复)。
  2. \\b用于单词边界。
  3. [[a-z]+仅考虑小写字符。
  4. $0用于整个匹配参数。

如有任何疑问/问题,请随时发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.