Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 20:20:29
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Программирование на C#. Регулярные выражения


Перейти к обзору всех тем

Регулярные выражения на примере синтаксического анализа SQL запроса

Регулярные выражения достаточно подробно описаны в одноименном компьютерном курсе, размещенном на этом сайте. В его последней части представлен обзор вариантов применения регулярных выражений для синтаксического анализа выражений, соответствующих небольшим грамматикам. На этом шаге курса программирования на C# я хочу продемонстрировать использование сервисов поддержки регулярных выражений, которые входят в состав BCL .Net Framework. А использовать их я буду для структурного разбора строки SQL запроса. За основу будет взято регулярное выражение разбора SQL инструкции SELECT, которое детально рассматривается в том самом разделе того самого компьютерного курса по изучению синтаксиса и вариантов применения тех самых регулярных выражений. Ниже пример кода на C#, который анализирует введенный пользователем текст на соответствие синтаксису инструкции SELECT, и, в случае соответствия, выводит список запрашиваемых полей, список таблиц и список условий критерия отбора записей.

using System;
using System.Text.RegularExpressions;
namespace RegExSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex _RegEx = new Regex("(?i)^select((\\s*\\*\\s*)|((?(?<=select)\\s+|\\s*,\\s*)" +
                "(?<table_field>\\w+\\.\\w+))+\\s+)from((?(?<=from)\\s+|\\s*,\\s*)(?<table>\\w+\\s*))" +
                "+(\\s+where(?<criteria>(?(?<=where)\\s+|\\s+(and|or)\\s+)\\w+\\.\\w+\\s*(=|!=|<|<=|>|>=|\\" +
                "slike\\s)\\s*('(\\w|\\*)*'|(\\w+\\.\\w+))\\s*)+)?$");

            Console.Write("SQL: ");
            string _SQL = Console.ReadLine();

            if (_RegEx.IsMatch(_SQL))
            {
                Match _SQLMatch = _RegEx.Match(_SQL);

                Console.WriteLine();
                Console.WriteLine("Поля:");
                Group _SQLTableField = _SQLMatch.Groups["table_field"];
                foreach (Capture _Capture in _SQLTableField.Captures)
                    Console.WriteLine(_Capture.Value);

                Console.WriteLine();
                Console.WriteLine("Таблицы:");
                Group _SQLTable = _SQLMatch.Groups["table"];
                foreach (Capture _Capture in _SQLTable.Captures)
                    Console.WriteLine(_Capture.Value);

                Console.WriteLine();
                Console.WriteLine("Условия:");
                Group _SQLCriteria = _SQLMatch.Groups["criteria"];
                foreach (Capture _Capture in _SQLCriteria.Captures)
                    Console.WriteLine(_Capture.Value.Trim());

            }
            else Console.WriteLine("Ошибка синтаксиса SQL!");

            Console.WriteLine();
            Console.WriteLine("Нажмите любую кнопку для продолжения...");
            Console.ReadKey();
        }
    }
}

Если введенных текст соответствует грамматике регулярного выражения, то в этом случае из запроса извлекаются элементы поименованных групп (поля, таблицы, условия) и их состав выводится на экран.

Как уже было отмечено в описании компьютерного курса, регулярное выражение не учитывает все особенности синтаксиса SQL запроса. Например, все фактические значения в критерии отбора записей в данном случае необходимо указывать в кавычках (и числовые тоже), каждое поле обязательно должно быть указано вместе с соответствующей ему таблицей (SQL допускает перечисление полей без уточнения таблицы, если нет конфликтов имен), ну и т.д. и т.п. Вот пример работы программы:

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

Тому, кто собирается использовать регулярные выражения для подобных целей могу посоветовать выполнять синтаксический разбор текстовых выражений в несколько этапов. В случае разбора инструкции SELECT на первом этапе можно выделить основные части SQL запроса: SELECT, FROM, WHERE, ORDER BY и другие. На следующих этапах посредством более специализированных регулярных выражений последовательно произвести разбор каждой из этих частей отдельно.



Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.