簡體   English   中英

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

Output:

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

解釋:

  1. sql.replace("`", "")刪除所有反引號(通過用空字符串替換它們)以避免重復它們。
  2. \b用於單詞邊界。
  3. [az]+僅用於小寫字符。
  4. [AZ][az]+表示大寫字母后跟小寫字母。
  5. | 用作or
  6. $0用於整個匹配參數。

如有任何疑問/問題,請隨時發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM