Помогите с регулярным выражением ;-)
От: Win32nipuh  
Дата: 25.04.06 06:50
Оценка:
Задача:
дана строка со скриптом хранимой процедуры в T-SQL, нужно в ней найти AS и заменить на WITH ENCRYPTION AS
Т.е. скрипт создает процедуры, а нужно их создать зашифрованными.

Вот есть такая функция
public static void ProcessProcedure(ref String scr)
{
Regex reg = new Regex("create(\\s*)procedure[\\S\\s.]*\\sas");
Match m = reg.Match(scr);
if(m.Success)
{
scr = scr.Replace(" as","as");
scr = scr.Replace("\nas","\nwith encryption as");
}
}

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

CREATE PROCEDURE ....
/*
не забыть AS
*/

AS

или

--не забыть AS

AS



То сработает замена в комментарии.
Как обарботать комментарий и заменить нужное?

Спасибо!
Re: Помогите с регулярным выражением ;-)
От: _FRED_ Черногория
Дата: 25.04.06 07:19
Оценка:
Здравствуйте, Win32nipuh, Вы писали:

В примерах GoldParser была, кажется, граматика T-SQL…
... << RSDN@Home 1.2.0 alpha rev. 648>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Помогите с регулярным выражением ;-)
От: VladGalkin Украина  
Дата: 25.04.06 07:30
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>В примерах GoldParser была, кажется, граматика T-SQL…


А где именно? И была ли? И где можно грамматику для T-SQL глянуть/скачать, а то есть необходимость её заиметь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[3]: Помогите с регулярным выражением ;-)
От: _FRED_ Черногория
Дата: 25.04.06 07:44
Оценка: 6 (1)
Здравствуйте, VladGalkin, Вы писали:

_FR>>В примерах GoldParser была, кажется, граматика T-SQL…


VG>А где именно? И была ли? И где можно грамматику для T-SQL глянуть/скачать, а то есть необходимость её заиметь.


Есть к нему chm-файл, в нём, в качестве примера, она приведене и была.
... << RSDN@Home 1.2.0 alpha rev. 648>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: Помогите с регулярным выражением ;-)
От: Win32nipuh  
Дата: 25.04.06 10:59
Оценка:
Задача Уже, в шарпе конкретный случай обработать.
Помогите с регулярным выражением ;-)
От: Аноним  
Дата: 25.04.06 11:40
Оценка:
?< перед ним что вам надо
?! — не должно быть перед ним
так же и после а внутри [^ваш символ]


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
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...
Пока на собственное сообщение не было ответов, его можно удалить.