Regex для соответствия sql, где условия - PullRequest
2 голосов
/ 05 августа 2020

Каким должно быть мое регулярное выражение, чтобы получить условие WHERE без (GROUP\\ BY|HAVING|ORDER\\ BY|ASC|DESC|LIMIT)? Он отлично работает, если у меня есть любой из описанных параметров. Он также должен работать в обоих случаях (с этими параметрами или без них)

Мне нужно получить id=1 or id=2

QString query = "SELECT * FROM users WHERE id=1 or id=2"
QString whereString;  

QRegularExpression whereListRegex("\\ WHERE\\ (.*?)\\ (GROUP\\ BY|HAVING|ORDER\\ BY|ASC|DESC|LIMIT)\\ ", QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch whereIterator = whereListRegex.match(query);

1 Ответ

1 голос
/ 05 августа 2020

Вы можете использовать

QRegularExpression whereListRegex(R"(\sWHERE\s+(.*?)(?:\s+(?:GROUP\s+BY|HAVING|ORDER\s+BY|ASC|DESC|LIMIT)\b|\s*$))", QRegularExpression::CaseInsensitiveOption);

См. демонстрацию регулярного выражения

Соответствие регулярному выражению:

  • \s - пробел
  • WHERE - строка
  • \s+ - 1+ пробелов
  • (.*?) - Группа захвата 1: любые ноль или более символов, кроме символов перевода строки, как мало по возможности
  • (?:\s+(?:GROUP\ BY|HAVING|ORDER\ BY|ASC|DESC|LIMIT)\b|\s*$) - любой из двух:
    • \s+(?:GROUP\s+BY|HAVING|ORDER\s+BY|ASC|DESC|LIMIT)\b - 1+ пробелов, за которыми следует одна из альтернативных фраз
    • | - или
    • \s*$ - 0+ пробелов в конце строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...