Кто хорошо разбирается в сабже,
если не сложно, подскажите регексп
Есть 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: Перенесено модератором из 'Этюды для программистов' — Кодт
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 бесполезно — не зная того, чем Вы его
ищете, я не могу его оттестировать, а править чужое регулярное выражение
не легче, чем писать своё.
Здравствуйте, PPA, Вы писали:
PPA>Нужно регулярным выражением вырезать вот эту часть "or :xyz = 0" PPA>Условия: PPA>1. Это условие всегда обернуто скобками. PPA>2. Регистр букв у "XYZ" может быть различным PPA>3. Кол-во пробелов внутри может быть любое включая переносы строк и табуляции (в соответствии с синтаксисом SQL) PPA>4. Вместо ":" может быть значек "&" PPA>5. Вместо условия "= 0" может быть "is null" или "= '0'"
Здравствуйте, 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 для тестирования регулярных
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 . После этого компонуете, и не забудьте группы
расставить — чтобы в замене использовать.
Кстати, если Вам не нужны чёткие проверки соответствия, то второй ответ
(не мой) Вам подойдёт лучше.
Mikhail Polykovsky wrote: > R>После чего отлаживаете regexp по кускам: > R>[Nn][Aa][Mm][Ee]\w*= или [Nn][Aa][Mm][Ee][:blank:]*= > > Кстати, а разве в POSIX нет возможности указать игнорирвоание регистра?
Как-то, кажется, можно, но это надо смотреть по конкретным вариантам.
Сам я пользуюсь ViM, и последние 100 re я писал в нём. Поэтому поставил
переносимый вариант. Потом всё равно человек найдёт библиотеку и
появятся вопросы "помогите отладить RE". Тогда и оптимизируем — под
конкретный движок.