我有一个未知的连接传入,通过基地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 article获取了该功能的信息。
答案 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。