Одним из возможных способов является одновременное сопоставление схемы, таблицы и разделителей и использование групп захвата для отделения имен от окружающего пуха. Например:
`/^(\[[^]]+]|\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]'