4

正規表現を使用してストアドプロシージャを解析し、変更します。これが私のサンプルテキストです:

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

しかし、それは機能していません。何か案は?

4

3 に答える 3

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();
于 2012-10-27T05:52:31.377 に答える
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 );

ここで試してみてください

于 2012-10-27T08:08:58.830 に答える
0

バランスブラケットを入手する必要があります

Regex rx = new Regex(@"declare\s\@([a-zA-Z_][a-zA-Z0-9_]*)\w+table\w*\(((?<BR>\()|(?<-BR>\))|[^()]*)+\)");
于 2012-10-27T06:17:49.340 に答える