Регулярное выражение для фильтра - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующее регулярное выражение .NET, которое не работает, когда

  1. В группе 'val' есть пробел
  2. Группа 'val' не окруженапо одинарным кавычкам

Мне нужно решение Regex (а не анализатор), чтобы изменить этот шаблон, чтобы он соответствовал двум вышеупомянутым проблемам.Может ли кто-нибудь с немного большим опытом в Regex улучшить его?

(? \ w + | `. +` | \ [. + \]) \ S * (? [= <>]| LIKE) \ S * ( ': [-] | (?) ( (\ S []??:? ''?)) +) (: \ к \ B)? (?: \ s * (? (?: AND) | (?: OR)) \ s *)?

REGEX STORM .Net Tester
В шаблоне используется вычитание последовательности символов - поддерживает ли это regex101?

Группы захвата: поля могут быть опционально заключены в могилу (`) или в скобки ([]), если поле содержит пробелы или не алфавитно-цифровые символы.

Значения могут быть заключены в одинарные кавычки (').Избегайте одинарных кавычек, используя две одинарные кавычки.Избегайте подстановочных знаков '*' и '%', используя квадратные скобки "[*]" и "[%]".Экранируйте квадратные скобки '[' и ']' с квадратными скобками "[[]" и "[]]"

Логические операторы могут быть ИЛИ или И *

Операторы сравнения могут быть =, <,> или LIKE

Шаблон - это упрощение Microsoft Expression Filter для обработки только вышеуказанного подмножества.

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

"a LIKE 'b [*]' ИЛИ ​​[b] LIKE 'c' 'И d = f ИЛИ e =' d '" будет соответствовать:

  1. "a LIKE 'b [*]' OR".Группы для этого соответствия: field = "a", operator = LIKE, val = "b [*]", boolean = OR.
  2. "[b] LIKE 'c''s' AND".Группы: field = "b", operator = LIKE, val = "c's", логическое = AND.
  3. "d = f OR".Группы: field = "d", operator = "=", val = "f", логическое = OR.
  4. "e = 'd'".Группы: field = "e", operator = "=", val = "d", логическое =.Но регулярное выражение не соответствует этому тексту.

a LIKE 'b [*]' ИЛИ ​​[b] LIKE 'c''s' И d = f ИЛИ e = 'd'
[ab] =' d '
`efg`>' f '
g <4 <br>h =' '
i =' 3 '
[полное имя] =''
FirstName LIKE 'hello'
[FirstName] = 'g'
`Age`> 6
` Full Name` = ''

1 Ответ

0 голосов
/ 26 февраля 2019

Использовать отсюда версию .net, чтобы сэкономить много времени и усилий?

парсеры SQL для .net

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

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

Например:

TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmysql);
        sqlparser.sqltext = "ALTER TABLE `world`.`t1` ALTER `c1` SET DEFAULT 'abc';";
        Assert.IsTrue(sqlparser.parse() == 0);

        TAlterTableStatement alterTableStatement = (TAlterTableStatement)sqlparser.sqlstatements.get(0);
        TAlterTableOption alterTableOption = alterTableStatement.AlterTableOptionList.getAlterTableOption(0);
        Assert.IsTrue(alterTableOption.OptionType == EAlterTableOptionType.AlterColumn);
        Assert.IsTrue(alterTableOption.DefaultExpr.ToString().Equals("'abc'", StringComparison.CurrentCultureIgnoreCase));

Показывает, как успешно извлечь значение DEFAULT из оператора alter table:

"ALTER TABLE `world`.`t1` ALTER `c1` SET DEFAULT 'abc';";

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

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

Я никоим образом не связан с автором, и я не рекомендую использовать это, если вы найдете то, что подходит вам лучшевсе, что я хочу сказать, это использовать этот ПОДХОД и продемонстрировать его в действии.

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