Исключение определенной подстроки из регулярного выражения - PullRequest
0 голосов
/ 06 мая 2010

Я пытаюсь изменить SQL-запрос с помощью регулярных выражений. По сути, моя цель - понять, что находится между FROM и ORDER BY, если существует ORDER BY.

Так, например, для запроса: SELECT * FROM TableA WHERE ColumnA=42 ORDER BY ColumnB он должен захватить TableA WHERE ColumnA=42, а также, если выражение ORDER BY отсутствует.

Самое близкое, на что я смог прийти - это SELECT (.*) FROM (.*)(?=(ORDER BY)), который не работает без ORDER BY.

Надеюсь, мне не хватает чего-то очевидного. В течение последнего часа я пытался заполучить Экспрессо.

Ответы [ 4 ]

1 голос
/ 06 мая 2010

Я думаю, что вы искали это:

^SELECT (.+) FROM (.+?)( ORDER BY (.+))?$

Обратите внимание, что я принудительно установил начальную и конечную точки строки. Таким образом, будет оцениваться необязательный порядок по, а если его нет, остальная часть кода будет включена во вторую группу совпадений.

P.S. Вы можете, конечно, отредактировать его так, как хотите. Я также поместил последние .+ в группу, чтобы вы могли легко получить доступ к ордеру по параметрам ... если вам это не нужно - вы можете удалить их: То же самое с первым в SELECT, но я думаю, вы уже это знаете:)

0 голосов
/ 06 мая 2010

Просто добавьте изменение к своему регулярному выражению:

SELECT (.*) FROM (.*)(?=(ORDER BY|\Z|$))

0 голосов
/ 06 мая 2010

Не могли бы вы просто добавить "ORDER BY" к строке перед применением регулярного выражения? Это немного взломать, но это должно сработать.

0 голосов
/ 06 мая 2010

Вы должны сделать необязательным целое подвыражение, включая ORDER BY, поставив ? после него:

SELECT (.*) FROM (.*?) (ORDER BY (.*))?$

Вам также нужно, чтобы образец после FROM был не жадным совпадением .*?, иначе это всегда будет использовать ORDER BY, а финальная часть никогда не совпадет.

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