регулярные выражения
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 03.08.05 05:53
Оценка:
Кто хорошо разбирается в сабже,
если не сложно, подскажите регексп

Есть SQL код в нем в разных местах могут находиться куски такого вида
(NAME = :XYZ or :xYz = 0)


Нужно регулярным выражением вырезать вот эту часть "or :xyz = 0"
т.е. чтоб осталось такое:
(NAME = :XYZ)


Условия:
1. Это условие всегда обернуто скобками.
2. Регистр букв у "XYZ" может быть различным
3. Кол-во пробелов внутри может быть любое включая переносы строк и табуляции (в соответствии с синтаксисом SQL)
4. Вместо ":" может быть значек "&"
5. Вместо условия "= 0" может быть "is null" или "= '0'"

Зарание спасибо :shuffle:



03.08.05 11:25: Перенесено модератором из 'Этюды для программистов' — Кодт
Re: регулярные выражения
От: raskin Россия  
Дата: 03.08.05 06:06
Оценка: 4 (1)
PPA wrote:
> Есть SQL код в нем в разных местах могут находиться куски такого вида
>
> (NAME = :XYZ or :xYz = 0)
>
>
>
> Нужно регулярным выражением вырезать вот эту часть "or :xyz = 0"
> т.е. чтоб осталось такое:
>
> (NAME = :XYZ)
>
>
>
> Условия:
> 1. Это условие всегда обернуто скобками.
> 2. Регистр букв у "XYZ" может быть различным
> 3. Кол-во пробелов внутри может быть любое включая переносы строк и
> табуляции (в соответствии с синтаксисом SQL)
> 4. Вместо ":" может быть значек "&"
> 5. Вместо условия "= 0" может быть "is null" или "= '0'"
>
> Зарание спасибо

Версия regexp?
Что-то вроде
s/[(](NAME[:blank:]*=[:blank:]*([:&])[Xx][Yy][Zz])[:blank:]+or[:blank:]+
\2[Xx][Yy][Zz][:blank:]*(([:blank:]*=[:blank:]*0[:blank:]*)|([:blank:]*=
[:blank:]*'0'[:blank:]*)|([:blank:]is[:blank:]null[:blank:]))[)]/\1/g

[:blank:] может быть заменено на \s, \w (в зависимоости от версии, но
всегда есть сокращение для всех whitespace)
NAME замените на шаблон имён
Возможно, все скобки, кроме [(] и [)] надо предварять \
*,+ могут предваряться или нет \ в зависимости от версии
Вообще-то, брать чужой regexp бесполезно — не зная того, чем Вы его
ищете, я не могу его оттестировать, а править чужое регулярное выражение
не легче, чем писать своё.
Posted via RSDN NNTP Server 2.0 beta
Re: регулярные выражения
От: Mikhail Polykovsky Россия http://glader.ru
Дата: 03.08.05 06:06
Оценка: 5 (1)
Здравствуйте, PPA, Вы писали:

PPA>Нужно регулярным выражением вырезать вот эту часть "or :xyz = 0"

PPA>Условия:
PPA>1. Это условие всегда обернуто скобками.
PPA>2. Регистр букв у "XYZ" может быть различным
PPA>3. Кол-во пробелов внутри может быть любое включая переносы строк и табуляции (в соответствии с синтаксисом SQL)
PPA>4. Вместо ":" может быть значек "&"
PPA>5. Вместо условия "= 0" может быть "is null" или "= '0'"

$sql =~ s/or [:&]xyz (= 0|is null|= '0')//i;
Re[2]: регулярные выражения
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 03.08.05 06:53
Оценка:
Здравствуйте, raskin, Вы писали:
R>Версия regexp?
R>Что-то вроде
R>s/[(](NAME[:blank:]*=[:blank:]*([:&])[Xx][Yy][Zz])[:blank:]+or[:blank:]+
R>\2[Xx][Yy][Zz][:blank:]*(([:blank:]*=[:blank:]*0[:blank:]*)|([:blank:]*=
R>[:blank:]*'0'[:blank:]*)|([:blank:]is[:blank:]null[:blank:]))[)]/\1/g

R>[:blank:] может быть заменено на \s, \w (в зависимоости от версии, но

R>всегда есть сокращение для всех whitespace)
R>NAME замените на шаблон имён
R>Возможно, все скобки, кроме [(] и [)] надо предварять \
R>*,+ могут предваряться или нет \ в зависимости от версии
R>Вообще-то, брать чужой regexp бесполезно — не зная того, чем Вы его
R>ищете, я не могу его оттестировать, а править чужое регулярное выражение
R>не легче, чем писать своё.

Спасибо.
Версию Regexp-а пока не знаю, будет встраиваться в приложение на C++
какой заработает, тот и встрою : )
а какой нужен regexp чтобы твое заработало?
я вот тут прогу скачал Expresso для тестирования регулярных

http://www.ultrapico.com/ExpressoDownload.htm

На твою версию оно ругается что с ошибкой,
p.s.
текст регекспа копировал через буфер обмена
Re[3]: регулярные выражения
От: raskin Россия  
Дата: 03.08.05 07:09
Оценка:
PPA wrote:
> Спасибо.
> Версию Regexp-а пока не знаю, будет встраиваться в приложение на C++
> какой заработает, тот и встрою : )
Библиотеку назвали бы.
> а какой нужен regexp чтобы твое заработало?
Ну я писал почти по POSIX Extended, если не путаю.
> я вот тут прогу скачал Expresso для тестирования регулярных
>
> http://www.ultrapico.com/ExpressoDownload.htm
>
.NET под wine — извращение.
> На твою версию оно ругается что с ошибкой,
> p.s.
> текст регекспа копировал через буфер обмена

Верю. Во-первых переводы строки. Во-вторых, там может быть не
's/pat/rep/flg', а другой синтаксис по умолчанию (три параметра). К
тому, же, я, наверное, скобку забыл где-то. А вариантов regexp много.
Всё равно придётся писать по help.
Находите, как обозначить пробельный символ, группу, повторение,
повторение не менее 1 раза, одно из.
После чего отлаживаете regexp по кускам:
[Nn][Aa][Mm][Ee]\w*= или [Nn][Aa][Mm][Ee][:blank:]*=
сработает на NaME =. \([&:]\)[Xx][Yy][Zz] или ([&:])[Xx][Yy][Zz]
сработает на &XyZ . После этого компонуете, и не забудьте группы
расставить — чтобы в замене использовать.
Кстати, если Вам не нужны чёткие проверки соответствия, то второй ответ
(не мой) Вам подойдёт лучше.
Posted via RSDN NNTP Server 2.0 beta
Re[4]: регулярные выражения
От: Mikhail Polykovsky Россия http://glader.ru
Дата: 03.08.05 08:22
Оценка:
Здравствуйте, raskin, Вы писали:

R>После чего отлаживаете regexp по кускам:

R>[Nn][Aa][Mm][Ee]\w*= или [Nn][Aa][Mm][Ee][:blank:]*=

Кстати, а разве в POSIX нет возможности указать игнорирвоание регистра?
Re[5]: регулярные выражения
От: raskin Россия  
Дата: 03.08.05 17:04
Оценка:
Mikhail Polykovsky wrote:
> R>После чего отлаживаете regexp по кускам:
> R>[Nn][Aa][Mm][Ee]\w*= или [Nn][Aa][Mm][Ee][:blank:]*=
>
> Кстати, а разве в POSIX нет возможности указать игнорирвоание регистра?

Как-то, кажется, можно, но это надо смотреть по конкретным вариантам.
Сам я пользуюсь ViM, и последние 100 re я писал в нём. Поэтому поставил
переносимый вариант. Потом всё равно человек найдёт библиотеку и
появятся вопросы "помогите отладить RE". Тогда и оптимизируем — под
конкретный движок.
Posted via RSDN NNTP Server 2.0 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.