正则表达式在某些行上提取数据而丢弃其他行

时间:2013-04-29 20:24:47

标签: c# regex

我有这些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

1 个答案:

答案 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();

}