我有这些SQL DB创建脚本,我想从中提取表名以创建GRANT访问。
提取实际名称不是问题:
^CREATE TABLE ([\w\.]+)[\r\n]+
但是,如果我只想用Regex.Replace
从这些名称中创建GRANT语句(在第1组中),我会遇到与我不匹配的所有行我想摆脱。
e.g。
有关:
CREATE TABLE dbo.t_MyType
(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)
CREATE TABLE dbo.t_MyType2
(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)
我明白了:
GRANT SELECT ON dbo.t_MyType TO db_read(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)
GRANT SELECT ON dbo.t_MyType2 TO db_read(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)
所以问题是:为了获得以下结果,我需要使用什么是正则表达式和替换字符串对?
GRANT SELECT ON dbo.t_MyType TO db_read
GRANT SELECT ON dbo.t_MyType2 TO db_read
答案 0 :(得分:1)
不要进行替换,只需枚举MatchCollection返回的Regex.Matches并构建一个新的sql文件。 (您需要稍微修改一下你的正则表达式)
static void Main(string[] args)
{
string query =
@"CREATE TABLE dbo.t_MyType
(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType (TypeName)
CREATE TABLE dbo.t_MyType2
(
ID INTEGER PRIMARY KEY IDENTITY,
TypeName VARCHAR(16) NOT NULL
)
CREATE UNIQUE INDEX IndexMyType ON dbo.t_MyType2 (TypeName)";
string matchString = @"CREATE TABLE ([\w\.]+)";
var matches = Regex.Matches(query, matchString);
StringBuilder sb = new StringBuilder();
foreach (Match match in matches)
{
sb.AppendFormat("GRANT SELECT ON {0} TO db_read", match.Groups[1]).AppendLine();
}
Console.WriteLine(sb.ToString());
Console.ReadLine();
}