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

我正在使用正则表达式来解析存储过程以便修改它们.

这是我的示例文本:

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);

但它不起作用.
有任何想法吗?

最佳答案 您必须使用单线模式而不是多线模式

在单线模式下使用此正则表达式

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

点赞