如何使用正则表达式在多行文本中查找关键模式

时间:2012-10-27 05:23:04

标签: c# regex stored-procedures

我正在使用正则表达式来解析存储过程以便修改它们。 这是我的示例文本:

DECLARE @TempTable TABLE
(
    TempID          int IDENTITY PRIMARY KEY,
    AMFID           smallint,
    AppModID        smallint,
    AppID           tinyint,
    ModID           smallint,
    FPID            smallint,
    URL         varchar(100),
    SortIndex       smallint,
    [AppName]       varchar(100),
    ModName     varchar(100),
    FPName      varchar(100),
    WUCData     varchar(7000)
)

-- Fill the temp table
INSERT INTO @TempTable
(
    AMFID,
    AppModID,
    AppID,
    ModID,
    FPID,
    URL,
    SortIndex,
    [AppName],
    ModName,
    FPName,
    WUCData
)
SELECT
    siAppModFP.AMFID,
    siAppModFP.AppModID,
    siAppModule.AppID,
    siAppModule.ModID,
    siAppModFP.FPID,
    siAppModFP.URL,
    siAppModFP.SortIndex,
    siApplication.[AppName],
    siModule.ModName,
    siFP.FPName,
    dbo.funcGetAppModFPWUC(siAppModFP.AMFID)
FROM siApplication WITH (NOLOCK) 

...

我只是想得到这个部分:

DECLARE @TempTable TABLE
(
    TempID          int IDENTITY PRIMARY KEY,
    AMFID           smallint,
    AppModID        smallint,
    AppID           tinyint,
    ModID           smallint,
    FPID            smallint,
    URL         varchar(100),
    SortIndex       smallint,
    [AppName]       varchar(100),
    ModName     varchar(100),
    FPName      varchar(100),
    WUCData     varchar(7000)
)

请注意,它可能会重复多次。我希望文本中的临时表的所有声明。 我使用了以下常规模式:

string re1 = "(Declare)( )(@)((?:[a-z][a-z0-9_]*))(\\s+)(Table)(\\s+)(\\(.*\\))";
Regex r = new Regex(re1, RegexOptions.Multiline | RegexOptions.IgnoreCase);

但它不起作用。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

试试这个Regex

DECLARE\s+@(\w+)\s+TABLE\s+\(([^,\(\)]+(\(\d+\))?(,)?)+\)

和示例代码:

var pattern = @"DECLARE\s+@(\w+)\s+TABLE\s+\(([^,\(\)]+(\(\d+\))?(,)?)+\)";
var matches = Regex.Matches(inputText, pattern);

foreach(Match match in matches)
    Output.Lines.Add(match.ToString());

// or in LINQ way
var result = from Match match in matches select match.ToString();

答案 1 :(得分:1)

您必须使用singleline模式 multiline模式

将此regexsingleline模式

一起使用
declare\s*@(?:[a-z]\w*)\s*table.*?\)\s*\)

所以,它应该是

string re1 = @"declare\s*@(?:[a-z]\w*)\s*table.*?\)\s*\)";
Regex r = new Regex(re1 ,RegexOptions.Singleline | RegexOptions.IgnoreCase );

试试here

答案 2 :(得分:0)

您需要获得balancing brackets

Regex rx = new Regex(@"declare\s\@([a-zA-Z_][a-zA-Z0-9_]*)\w+table\w*\(((?<BR>\()|(?<-BR>\))|[^()]*)+\)");