Регулярное выражение для соответствия "select ... from ... where" sql запросов - PullRequest
2 голосов
/ 02 октября 2009

Я хочу найти последовательность «выбрать откуда» в строке. Например,

"select * from T WHERE t.c1 =1"

должно совпадать.

Вот шаблон регулярного выражения, который я написал:

"SELECT\s\.*FROM\s\.*WHERE\s\.*";

Но это не работает. Что с ним не так?

Ответы [ 6 ]

8 голосов
/ 02 октября 2009

Вы не должны были убирать точки с обратной косой черты; с тех пор как вы это сделали, движок пытается соответствовать буквальной точке, а не «любому символу», как вы ожидаете.

Попытка:

SELECT\s.*FROM\s.*WHERE\s.*

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

5 голосов
/ 02 октября 2009

Я не уверен, на какой движок регулярных выражений вы нацеливаетесь, но вы можете попробовать это:

# note the trailing i, which in perl means case-insensitive
# this will also put the interesting bits into regex backreferences
#
# This also changes \s to \s+ in case you have a situation with multiple
# spaces between terms
#
/select\s+(.*)\s+from\s+(.*)\s+where\s+(.*)/i
1 голос
/ 02 октября 2009

Одна проблема с RE заключается в том, что он чувствителен к регистру. В зависимости от формы RE, возможно, существует флаг для указания сопоставления без учета регистра. Например, Perl-совместимые RE используют флаг "/ i": /SELECT\s.*FROM\s.*WHERE\s.*/i

0 голосов
/ 03 мая 2017

Попробуйте это регулярное выражение, я пытался быть немного более строгим с именами таблиц и столбцов, а также рассмотреть возможность использования фильтра с (=, <=,> =, <,> и IN ()):

string regex = "SELECT\W(([a-zA-z0-9]+)([,]*)\W)+\WFROM\W([a-zA-z0-9#]+)(\W[a-zA-Z])*\WWHERE\W([a-zA-z0-9_]+)\W([=<>IN(]+)\W(.+)"
0 голосов
/ 02 октября 2009

Спасибо ответ ваших парней. Я получил ответ от mmyers, вот мое окончательное решение:

        string szPattern = @"SELECT\s.*FROM\s.*WHERE\s.*";
        Regex  rRegEX = new Regex ( szPattern,RegexOptions.IgnoreCase | RegexOptions.Multiline );
        Match match =rRegEX.Match(testCase.Statement);
        if (match.Success)
0 голосов
/ 02 октября 2009

Предположения:

  • Ваше заявление sql не будет охватывать строки.
  • У вас не будет двух SQL-операторов в одной строке.

Это работает для меня.

SELECT\s+?[^\s]+?\s+?FROM\s+?[^\s]+?\s+?WHERE.*

Java избежала версия:

String regex = "SELECT\\s+?[^\\s]+?\\s+?FROM\\s+?[^\\s]+?\\s+?WHERE.*";

Вы можете добавить терминатор вместо. * В зависимости от вашего случая. Конечно, вы должны запустить его в режиме без учета регистра, ИЛИ соответствующим образом изменить регулярное выражение.

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