Re: Помогите с регулярным выражением ;-)
От: tazo_  
Дата: 30.04.06 20:31
Оценка:
Здравствуйте, Win32nipuh, Вы писали:

W>Задача:

W>дана строка со скриптом хранимой процедуры в T-SQL, нужно в ней найти AS и заменить на WITH ENCRYPTION AS
W>Т.е. скрипт создает процедуры, а нужно их создать зашифрованными.

W>Вот есть такая функция

W>public static void ProcessProcedure(ref String scr)
W>{
W> Regex reg = new Regex("create(\\s*)procedure[\\S\\s.]*\\sas");
W> Match m = reg.Match(scr);
W> if(m.Success)
W> {
W> scr = scr.Replace(" as","as");
W> scr = scr.Replace("\nas","\nwith encryption as");
W> }
W>}

W>Она все делает.

W>Но здесь одна проблема: она не учитывает комментарии, т.е. если перед реальным AS будет стоять

W>CREATE PROCEDURE ....

W>/*
W>не забыть AS
W>*/

W>AS


W>или


W>--не забыть AS


W>AS




W>То сработает замена в комментарии.

W>Как обарботать комментарий и заменить нужное?

W>Спасибо!


Как-нибудь так.

using System;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main ( string[] args )
        {
            string mask = @"create\s+procedure(\s|(--[^\n]*)|(/\*.*?\*/))+(?=as)";

            string[] tests =
            {
                "blah-blah-blah CREATE PROCEDURE\nAS blah-blah-blah",
                "blah-blah-blah CREATE PROCEDURE \t\r\n \r\n" +
                "/*** \r\n" + 
                " * c-style comment with CREATE PROCEDURE AS\r\n" +
                "***/\r\n\r\n" +
                "-- SQL comment with CREATE PROCEDURE AS \r\n\r\n" +
                "AS"
            };

            foreach(string sql in tests)
            {
                Console.WriteLine ( "*** Original:\r\n'{0}'", sql );

                Console.WriteLine ( "*** Replaced:\r\n'{0}'\r\n"
                    , Regex.Replace(sql, mask, "$&WITH ENCRYPTION "
                        , RegexOptions.IgnoreCase | RegexOptions.Singleline ) );
            }
        }
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.