解析来自GetSchema的Common Schema Collection的正则表达式

时间:2012-01-05 21:18:13

标签: c# .net sql regex schema

我有一个未知的连接传入,通过基地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
    }
}

我需要帮助设置LeftIdentifierRightIdentifier的值。

如果我使用Oracle连接运行该代码,quotedIdentifier会返回以下结果:

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

我想在这种情况下将LeftIdentifier设置为,将RightIdentifier设置为

如果我使用SQL Server连接运行该代码,quotedIdentifier会返回以下结果:

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

在这种情况下,我想将LeftIdentifier设置为 [,RightIdentifier等于]

任何人都可以帮助解决此问题所需的代码吗?我正在尝试一切绊脚石。

注意:我从此MSDN article获取了该功能的信息。

1 个答案:

答案 0 :(得分:1)

为此模式启用“忽略模式”空白。在这里,我将标识符转义为十六进制值。

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” [ABC] (AB)

并返回名为Text的命名捕获组中的文本abc。