Разбор регулярных выражений, выходящих из коллекции общих схем GetSchema - PullRequest
1 голос
/ 06 января 2012

У меня передается неизвестное соединение через базу DbConnection, это может быть MySQL, SQLite, Oracle, SQL Server, Access, я не знаю.

Мне нужно вытащитьзаключенные в кавычки идентификаторы из информации схемы, я выяснил, как получить заключенные в кавычки идентификаторы, но он возвращается в RegEx, и я недостаточно знаком с RegEx, чтобы иметь возможность анализировать их динамически.* Учитывая код C #:

public class DatabaseHelper
{
    internal char LeftIdentifier { get; private set; }

    internal char RightIdentifier { get; private set; }

    private void SetQuotedIdentifiers(DbConnection connection)
    {
        string quotedIdentifier = connection.GetSchema("DataSourceInformation").Rows[0]["QuotedIdentifierPattern"].ToString();
        LeftIdentifier = null; // some code I have to figure out
        RightIdentifier = null; // some code I have to figure out
    }
}

Мне нужна помощь в настройке значений LeftIdentifier и RightIdentifier.

Если я запускаю этот код с подключением Oracle, quotedIdentifier возвращается со следующим результатом:

(([^\"]\"\")*)

Я хочу установить LeftIdentifier в этом случае равным " и RightIdentifier также "

Если я запускаю этот код с подключением к SQL Server, quotedIdentifier возвращается со следующим результатом:

(([^\\[]|\\]\\])*)

В этом случае я хочу установить LeftIdentifier на [ и RightIdentifier равны ]

Может кто-нибудь помочь с кодом, необходимым для этого?Я сталкиваюсь с камнем преткновения всем, что пытаюсь.

Примечание. Информацию об этой функции я получил из этой статьи MSDN .

.

1 Ответ

1 голос
/ 06 января 2012

Включите пробел «Игнорировать шаблон» для этого шаблона. Здесь я избежал идентификаторов в виде шестнадцатеричных значений.

string pattern = #"
# \x28 (
# \x29 )
# \x22 "
# \x5B [
# \x5D ]

(?:[\x28\x29\x22\x5B\x5D])        # match but don't caputure the set above
(?<Text>[^\x28\x29\x22\x5B\x5D]+) # Get the inbetween text into Text capture group
(?:[\x28\x29\x22\x5B\x5D])        # match but don't caputure the set above    
";

или в виде одной строки без игнорирования

string pattern = @"(?:[\x28\x29\x22\x5B\x5D])(?<Text>[^\x28\x29\x22\x5B\x5D]+)(?:[\x28\x29\x22\x5B\x5D])";

Будет соответствовать

"а" [ABC] (Аb)

и возвращает текст abc в именованной группе захвата с именем Text.

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