Java регулярное выражение не соответствует - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть это регулярное выражение:

#(?<=[^\w`"\[?:]|^)[a-z_][a-z0-9_]*(?=[^\w`"(\]]|$)#Di

, и я пытаюсь сделать синтаксис SQL красивым. Например, из "SELECT * FROM users WHERE username = ?;" to

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=?;");

У кого-нибудь есть идея, пожалуйста?

1 Ответ

0 голосов
/ 06 апреля 2020

Сделайте это следующим образом:

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 ("` "," ") удаляет все обратные пометки (заменяя их пустой строкой), если они уже присутствуют, чтобы избежать их дублирования.
  2. \b используется для границы слова.
  3. [a-z]+ - только для строчных букв.
  4. [A-Z][a-z]+ - для заглавных букв, за которыми следуют строчные буквы.
  5. | используется как or.
  6. $0 используется для аргумента полного соответствия.

Не стесняйтесь комментировать в случае любых сомнений / проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...