Разбор выражения фильтра с использованием RegEx - PullRequest
0 голосов
/ 05 февраля 2009

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

CustomerName Starts With 'J' 

становится

CustomerName LIKE 'J%'

и

CustomerName Includes 'Smi'

становится

CustomerName LIKE '%Smi%'

Полное выражение для анализа может быть намного сложнее, например

CustomerName Starts With 'J' AND State = 'CA'

должно стать

CustomerName LIKE 'J%' AND State = 'CA'

Как лучше всего это сделать? Можно ли это легко сделать с помощью RegEx (я не эксперт по регулярным выражениям).

1 Ответ

1 голос
/ 05 февраля 2009

При отсутствии других ответов я забью свои 2 цента:

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

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

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

    public void Main()
    {
        string input = @"CustomerName Starts With 'J' AND State = 'CA'";

        ReplaceStartsWith(ref input);
        //...
        //ReplaceIncludes(ref input);

        Console.WriteLine(input);
        //Returns: CustomerName LIKE 'J%' AND State = 'CA'
    }

    void ReplaceStartsWith(ref string input)
    {
        input = startsWithRegex.Replace(input, match =>
            string.Format("LIKE '{0}%'", match.Groups["literal"]));
    }

     

    static RegexOptions commonOptions =
        RegexOptions.Compiled |
        RegexOptions.ExplicitCapture |
        RegexOptions.IgnoreCase |
        RegexOptions.IgnorePatternWhitespace |
        RegexOptions.Singleline;

     

    static Regex startsWithRegex = new Regex(
        @"\bstarts\s+with\s+'(?<literal>[^']*)'"
        , commonOptions);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...