powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / регулярные выражения для разбора sql запроса
13 сообщений из 13, страница 1 из 1
регулярные выражения для разбора sql запроса
    #40074179
Kometulus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем, кто это читает
Пытаюсь разобраться в написании регулярного выражения для разбора sql запроса следующего вида:
Select field1, field2 … from table1 where field1 < 5

Есть список требований:
- Количество полей может быть перечислено сколько угодно.
- После последнего поля нету символа «,»
- Таблица может быть только одна
- Возможны только знаки сравнения <>,<,>,<=,>=,=
- Сравнение выполняется только с целыми числами
- Между словами и знаками может быть сколько угодно пробелов, в соответствии с синтаксисом sql.

Что-то ничего не выходит, кто-нибудь знает как это делается?
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074181
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут есть один мембер, который эксперт в регулярках, давно, правда, его что-то не видно. Он даже писал на регулярках транспиллеры из перла с сиплюсплюс и т.п.

Если серьёзно, то область всей теории регулярных языков и, соответственно, регулярных выражений это только лексический разбор текста. Весь запрос ты этим не разберешь, потому что это уже синтаксический разбор, который выходит за рамки регулярщины.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074191
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если речь про MSSQL, то есть такая сборка Microsoft.SqlServer.Management.SqlParser.dll, она входит в SSMS и в VS, возможно распространяется с каким то бесплатным пакетом для Windows, ищите и обрящете. Я взял тот, что из папки с SSMS

В результате вызова получим довольно сложный объект, я не разбирался, что да как в нем, оставляю это вам. Но там есть свойство
result.Script.Xml, которую можно к примеру открыть в XmlDocument, но думаю лучше разобраться в кишках самого объекта, там всё есть
Как это лицензировать я не знаю, можно ли делать такое, вопрос... Но как мне кажется, если у вас есть на компе такая сборка, значит можно :) почему нет. И скорее всего её можно возить с собой, нужно только разобраться с зависимостями

у меня файлы были вот тут:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
C:\>dir Microsoft.SqlServer.Management.SqlParser.dll /s /b /a
C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\
    Common7\IDE\Microsoft.SqlServer.Management.SqlParser.dll
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\SQLCommon\
    130\Microsoft.SqlServer.Management.SqlParser.dll
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\SQLCommon\
    140\Microsoft.SqlServer.Management.SqlParser.dll
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\SQLCommon\
    150\Microsoft.SqlServer.Management.SqlParser.dll [code=plaintext]
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using System;
using Microsoft.SqlServer.Management.SqlParser.Parser;

namespace ExampleConsoleProject
{
    class Program
    {
        static void Main(string[] args)
        {
            var result = Parser.Parse("SELECT A,B,C FROM TABLE1 WHERE A = 1");
            Console.WriteLine(result.Script.Xml);
            Console.ReadKey();
        }
    }
}





Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
<SqlSelectStatement Location="((1,1),(1,37))">
  <!--SELECT A,B,C FROM TABLE1 WHERE A = 1-->
  <SqlSelectSpecification Location="((1,1),(1,37))">
    <!--SELECT A,B,C FROM TABLE1 WHERE A = 1-->
    <SqlQuerySpecification Location="((1,1),(1,37))">
      <!--SELECT A,B,C FROM TABLE1 WHERE A = 1-->
      <SqlSelectClause Location="((1,1),(1,13))" IsDistinct="False">
        <!--SELECT A,B,C-->
        <SqlSelectScalarExpression Location="((1,8),(1,9))">
          <!--A-->
          <SqlColumnRefExpression Location="((1,8),(1,9))" ColumnName="A" MultipartIdentifier="A">
            <!--A-->
            <SqlObjectIdentifier Location="((1,8),(1,9))" ObjectName="A">
              <!--A-->
              <SqlIdentifier Location="((1,8),(1,9))" Value="A">
                <!--A-->
              </SqlIdentifier>
            </SqlObjectIdentifier>
          </SqlColumnRefExpression>
        </SqlSelectScalarExpression>
        <SqlSelectScalarExpression Location="((1,10),(1,11))">
          <!--B-->
          <SqlColumnRefExpression Location="((1,10),(1,11))" ColumnName="B" MultipartIdentifier="B">
            <!--B-->
            <SqlObjectIdentifier Location="((1,10),(1,11))" ObjectName="B">
              <!--B-->
              <SqlIdentifier Location="((1,10),(1,11))" Value="B">
                <!--B-->
              </SqlIdentifier>
            </SqlObjectIdentifier>
          </SqlColumnRefExpression>
        </SqlSelectScalarExpression>
        <SqlSelectScalarExpression Location="((1,12),(1,13))">
          <!--C-->
          <SqlColumnRefExpression Location="((1,12),(1,13))" ColumnName="C" MultipartIdentifier="C">
            <!--C-->
            <SqlObjectIdentifier Location="((1,12),(1,13))" ObjectName="C">
              <!--C-->
              <SqlIdentifier Location="((1,12),(1,13))" Value="C">
                <!--C-->
              </SqlIdentifier>
            </SqlObjectIdentifier>
          </SqlColumnRefExpression>
        </SqlSelectScalarExpression>
      </SqlSelectClause>
      <SqlFromClause Location="((1,14),(1,25))">
        <!--FROM TABLE1-->
        <SqlTableRefExpression Location="((1,19),(1,25))" ObjectIdentifier="TABLE1">
          <!--TABLE1-->
          <SqlObjectIdentifier Location="((1,19),(1,25))" ObjectName="TABLE1">
            <!--TABLE1-->
            <SqlIdentifier Location="((1,19),(1,25))" Value="TABLE1">
              <!--TABLE1-->
            </SqlIdentifier>
          </SqlObjectIdentifier>
        </SqlTableRefExpression>
      </SqlFromClause>
      <SqlWhereClause Location="((1,26),(1,37))">
        <!--WHERE A = 1-->
        <SqlComparisonBooleanExpression Location="((1,32),(1,37))" ComparisonOperator="Equals">
          <!--A = 1-->
          <SqlColumnRefExpression Location="((1,32),(1,33))" ColumnName="A" MultipartIdentifier="A">
            <!--A-->
            <SqlObjectIdentifier Location="((1,32),(1,33))" ObjectName="A">
              <!--A-->
              <SqlIdentifier Location="((1,32),(1,33))" Value="A">
                <!--A-->
              </SqlIdentifier>
            </SqlObjectIdentifier>
          </SqlColumnRefExpression>
          <SqlLiteralExpression Location="((1,36),(1,37))" Value="1" Type="Integer">
            <!--1-->
          </SqlLiteralExpression>
        </SqlComparisonBooleanExpression>
      </SqlWhereClause>
    </SqlQuerySpecification>
  </SqlSelectSpecification>
</SqlSelectStatement>


...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074192
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074204
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kometulus
Что-то ничего не выходит, кто-нибудь знает как это делается?


Если не секрет, цель данного упражнения?
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074209
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Если не секрет, цель данного упражнения?

Вестимо, запись "зачет" в зачетке. Если особо поразить преподавателя, то он, может быть, напишет: "Автор - адский сатана", но я такого еще не видел.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074215
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka
hVostt
Если не секрет, цель данного упражнения?

Вестимо, запись "зачет" в зачетке. Если особо поразить преподавателя, то он, может быть, напишет: "Автор - адский сатана", но я такого еще не видел.


Ну судя по требованию сделать это на регулярках и ограничениях, это точно не практическая задача.

Особо понравилось:

Kometulus
Пытаюсь разобраться в написании...


и

Kometulus
Что-то ничего не выходит


:)

Т.е. по сути все "попытки" ограничились рассылкой на разные площадки и форумы.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074237
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kometulus,

Контекстно-зависимые грамматики алгоритмами, основанными на конечных автоматах, не разбираются. Просто примите это как аксиому. Даже попытка написать на регулярках парсер html или xml обречена на провал. Здесь можно использовать какие-нить паттерны типа визитор, ANTLR, ещё что-то, но не регулярки.
Есть вот такой легендарный пост на SoF - к парсингу SQL регулярками он относится в ещё большей степени.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074354
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Контекстно-зависимые грамматики алгоритмами, основанными на конечных автоматах, не разбираются.

Контестно-свободные тоже
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074356
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Настоящим разбором SQL-выражения занимается сервер БД. Если что-то входит просто в SSMS, то это, скорее всего, что-то для подсветки синтаксиса, м.б. интеллисенса, и т.п.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074372
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka,

какая разница? конкретную задачу автора данная либа решает. можно посмотреть все столбцы, таблицы, учесть union'ы, не знаю как там с view'ами и т.д. Надо просто пробовать, сам не юзал, но судя по XML вся инфа есть. Есть даже знакоместа.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074378
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
какая разница? конкретную задачу автора данная либа решает.

Так-то да, я согласен.
...
Рейтинг: 0 / 0
регулярные выражения для разбора sql запроса
    #40074997
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkfka
пропущено...

Вестимо, запись "зачет" в зачетке. Если особо поразить преподавателя, то он, может быть, напишет: "Автор - адский сатана", но я такого еще не видел.


Ну судя по требованию сделать это на регулярках и ограничениях, это точно не практическая задача.

Особо понравилось:

Kometulus
Пытаюсь разобраться в написании...


и

Kometulus
Что-то ничего не выходит


:)

Т.е. по сути все "попытки" ограничились рассылкой на разные площадки и форумы.


"регулярные выражения" - это вершина для преподавателя и студента того заведения.
Последнее пристанище. А вот то, о чем написал юзер, что некоторые грамматики не разбираются при помощи рв - это уже за гранью добра и зла для них.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / регулярные выражения для разбора sql запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]