Выражение Regex для разбора SQL Схема сервера и имя таблицы - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь проанализировать схему и имя таблицы с помощью регулярного выражения. Я использую C# (. NET Core) и System.Text.RegularExpressions.

Вот примеры того, как может выглядеть ввод:

Schema.TableName
Schema . TableName
[Schema].[TableName]
[Schema] . [TableName]
Schema. [TableName]
[SchemaPart1.Part2.Part  3].[Table . Name]

И, конечно, другие варианты, которые SQL Сервер принимает, когда вы хотите создать таблицу, используя таблицу и имя схемы.

Кроме того, я поддерживаю другие базы данных (MySql & Postgres), поэтому я буду использовать то же регулярное выражение, но заменим [] на правильный символ кавычки (`или"). Но я использовал Sql Примеры серверов, потому что начальный и конечный символы кавычек различны.

Мое текущее регулярное выражение выглядит так:

\.?\[.+?\]|[^\[]+?(?=\.)|[^\[]+

Это работает в большинстве случаев. Но, например, в в этом случае [Schema] . [TableName] Я получаю совпадение для пробелов, между которыми я не совсем уверен, как отфильтровать.

Любая помощь будет признательна.

1 Ответ

1 голос
/ 24 марта 2020

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

`/^(\[[^]]+]|\w+) *\. *(\[[^]]+]|\w+)/gm`

См. regex demo .

C# пример:

using System;
using System.Text.RegularExpressions;
// ...
String text = "Schema.TableName\nSchema . TableName\n[Schema].[TableName]\n[Schema] . [TableName]\nSchema. [TableName]\n[SchemaPart1.Part2.Part  3].[Table . Name]";
Regex re = new Regex(@"^(\[[^]]+\]|\w+) *\. *(\[[^]]+\]|\w+)", RegexOptions.Multiline);
Match match = re.Match(text);

while (match.Success) {
    Console.WriteLine("( '{0}', '{1}' )", match.Groups[1].Value, match.Groups[2].Value);
    match = match.NextMatch();
}

Выход:

'Schema', 'TableName'
'Schema', 'TableName'
'[Schema]', '[TableName]'
'[Schema]', '[TableName]'
'Schema', '[TableName]'
'[SchemaPart1.Part2.Part  3]', '[Table . Name]'

ИЛИ

Если вы хотите сопоставить схему или таблицу, не делая различий между ними, вы можете попробовать вариацию своего выражения. Имейте в виду, что это также будет соответствовать простым строкам, таким как foo. Например:

`/\.? *(?:\[[^]]+\]|\w+)/g`

См. regex demo .

C# пример (using и text такие же, как указано выше):

MatchCollection matches = Regex.Matches(text, @"\.? *(?:\[[^]]+\]|\w+)");
foreach (Match m in matches) Console.WriteLine("'{0}'", m);

Выход:

'Schema'
'.TableName'
'Schema'
'. TableName'
'[Schema]'
'.[TableName]'
'[Schema]'
'. [TableName]'
'Schema'
'. [TableName]'
'[SchemaPart1.Part2.Part  3]'
'.[Table . Name]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...