Регулярное выражение для соответствия общему синтаксису SQL?

Вы можете попробовать что-то вроде следующего:

cat your_file.txt | grep 'instance-name-3' | awk '{print $3}'

При этом будет извлечен только IP-адрес (столбец 3) строки с именем instance-name-3

. :

enter image description here

16
задан Omar Kooheji 26 September 2008 в 14:49
поделиться

10 ответов

Регулярные выражения могут соответствовать языкам, которые может проанализировать только конечный автомат, который очень ограничен, тогда как SQL является синтаксисом. можно продемонстрировать, что Вы не можете проверить SQL с regex. Так, можно прекратить пробовать.

38
ответ дан 30 November 2019 в 15:30
поделиться

SQL грамматика типа 2 , слишком способно быть описанным регулярными выражениями. Это - то же, как будто Вы решили генерировать код C# и затем проверить его, не вызывая компилятор. Механизм базы данных в целом слишком сложен, чтобы быть легко заблокированным.

Однако можно попробовать грамматики SQL ANTLR .

14
ответ дан 30 November 2019 в 15:30
поделиться

Насколько я знаю, что это вне regex и Вашего нахождения рядом с темными искусствами BnF и компиляторов.

http://savage.net.au/SQL/

То же самое происходит с людьми, которые хотят сделать выделение правильного синтаксиса. Вы запускаете вещи зубрежки в regex, и затем Вы заканчиваете тем, что писали компилятор...

2
ответ дан 30 November 2019 в 15:30
поделиться

Первое, что пришло на ум: разве Вы не могли передать сгенерированный SQL базе данных, и использование ОБЪЯСНЯЮТ на них и ловят какие-либо исключения, которые указали бы на плохо сформированный SQL?

1
ответ дан 30 November 2019 в 15:30
поделиться

Вы попробовали ленивые селекторы. Вместо того, чтобы соответствовать как можно больше, они соответствуют как можно меньше, которое является, вероятно, в чем Вы нуждаетесь для кавычек.

0
ответ дан 30 November 2019 в 15:30
поделиться

Для проверки запросов просто выполните их с , УСТАНАВЛИВАЕТ NOEXEC НА , именно так менеджер Entreprise делает это, когда Вы анализируете запрос, не выполняя его.

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

0
ответ дан 30 November 2019 в 15:30
поделиться

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

0
ответ дан 30 November 2019 в 15:30
поделиться

Я не думаю, что даже необходимо было создать схему, чтобы быть в состоянии проверить оператор, потому что система не попытается разрешить object_name и т.д., пока это успешно не проанализировало оператор.

С Oracle как пример, Вы, конечно, получили бы ошибку, если бы Вы сделали:

select * from non_existant_table;

В этом случае, "РТЫ 00942: таблица или представление не существуют".

Однако, если Вы выполняетесь:

select * frm non_existant_table;

Тогда Вы получите синтаксическую ошибку, "РТЫ 00923: ОТ ключевого слова, не найденного, где ожидается".

должно быть возможно классифицировать ошибки в ошибки анализа синтаксиса, которые указывают на неправильный синтаксис и ошибки, касающиеся имени таблиц и полномочий и т.д.

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

0
ответ дан 30 November 2019 в 15:30
поделиться

Существуют грамматики ANTLR для парсинга SQL. Это - действительно лучшая идея использовать в базе данных памяти или очень легкой базе данных такой как sqlite. Кажется расточительным мне протестировать, допустим ли SQL с точки зрения парсинга и намного более полезен проверить имена таблиц и имена столбцов и специфические особенности Вашего запроса.

0
ответ дан 30 November 2019 в 15:30
поделиться

Я предполагаю, что Вы сделали что-то как ".*" пробуют вместо этого" [^ "] *", который помешает Вам есть целую строку. Это все еще даст ложные положительные стороны на случаях, где Вы имеете \" в Ваших строках.

-1
ответ дан 30 November 2019 в 15:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: