解析来自GetSchema的正则表达式';的公共架构集合

本文关键字:集合 GetSchema 正则表达式 | 更新日期: 2023-09-27 18:19:38

我有一个未知的连接正在通过基础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等于][strong>

有人能帮我完成这项工作所需的代码吗?我所尝试的一切都遇到了绊脚石。

注意:我从MSDN的这篇文章中获得了函数的信息

解析来自GetSchema的正则表达式';的公共架构集合

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

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。