Regex提取某些行的数据,同时丢弃其他行的数据

本文关键字:数据 其他 提取 Regex | 更新日期: 2023-09-27 18:11:19

我有这些SQL DB创建脚本,我想从中提取表名以创建GRANT访问。

提取实际名称没有问题:

<>之前^CREATE TABLE (['w'.]+)['r'n]+之前

然而,如果我只想做一个Regex.Replace来从这些名字(在组1中)创建GRANT语句,我就会被所有不匹配的行所困,我想摆脱

为:

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

Regex提取某些行的数据,同时丢弃其他行的数据

不做替换,只通过Regex返回的MatchCollection枚举。匹配并构建一个新的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();
}