解析来自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
}
}
我需要帮助设置LeftIdentifier
和RightIdentifier
的值。
如果我使用Oracle连接运行该代码,quotedIdentifier
会返回以下结果:
(([^'"]'"'")*)
在这种情况下,我想将LeftIdentifier
设置为",将RightIdentifier
也设置为"
如果我使用SQL Server连接运行该代码,quotedIdentifier
会返回以下结果:
(([^''[]|'']''])*)
在这种情况下,我想将LeftIdentifier
设置为[,RightIdentifier等于][strong>
有人能帮我完成这项工作所需的代码吗?我所尝试的一切都遇到了绊脚石。
注意:我从MSDN的这篇文章中获得了函数的信息
启用此模式的"忽略模式空白"。在这里,我将标识符转义为十六进制值。
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。