Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

"Регулярные выражения"

Вот к примеру есть такой текст:

LowerCase(DateTimeToStr(Now));

Возможно ли вообще, и если да то как, проверить парность всех скобок?

Ответить   Tue, 25 Apr 2006 23:53:03 +0300 (#541821)

 

Ответы:

Здравствуйте, VITO!

Например так:

Счетчик = 0.
Читать по одному символу, слева направо.
Если символ - открывающая скобка, увеличить счетчик на 1.
Если символ - закрывающая скобка, уменьшить счетчик на 1.
Если в конце строки счетчик равен нулю - все правильно.
Если в конце строки счетчик больше нуля - не все скобки закрыты.
Если в конце строки счетчик меньше нуля - закрывающих больше.
С уважением, AleX

Номер выпуска : 5296
Возраст листа : 948 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/541829
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Wed, 26 Apr 2006 03:28:37 +0400 (#541829)

 

Hello AleX,

Wednesday, April 26, 2006, 3:28:37 AM, you wrote:

bool bPermCoun=true;
bool bPermCoun2=true; //объясняется ниже

{
Если индекс символа больше 1
{
Если символ - кавычка
{
если предыдущий символ не '\\' bPermCoun=!bPermCoun;
}
Если символ - '/'
{
если предыдущий символ '/' break;
}
} иначе {
Если символ - кавычка
{
bPermCoun=!bPermCoun;
}
}
если bPermCoun и bPermCoun2
{
A> Если символ - открывающая скобка, увеличить счетчик на 1.
A> Если символ - закрывающая скобка, уменьшить счетчик на 1.
}
}
При построчном считывании еще надо учесть 2 тонкости. Наличие "/*" не после "/"
bPermCoun2=false;
И также этот случай внутри кавычек. Объявление bPermCoun2 естесно выносить из
цикла построчного цикла.

Ответить   Fri, 28 Apr 2006 21:31:53 +0400 (#543152)

 

По ходу, мы здесь зря тёрки трём - автор уже нашёл решение...

Номер выпуска : 5303
Возраст листа : 950 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543179
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sat, 29 Apr 2006 00:22:00 +0500 (#543179)

 

Здравствуйте, Deni_S!

Примерно так я недавно делал в одной программе:
псевдокод int счетчик = 0;
bool счет = истина;
bool комментарий = ложь;
цикл пока(строка_не_кончилась)
{
если(символ = кавычка)
счет = НЕ счет;
если(не_первый_символ)
{
если(символ = / )
{
если((предыдущий_символ = * ) И (комментарий = истина))
комментарий = ложь;
иначе если(предыдущий_символ = / )
прервать_цикл;
}
иначе если(символ = * )
{
если((предыдущий_символ = / ) И (комментарий = ложь))
комментарий = истина;
}
}
если((счет = истина) И (комментарий = ложь))
{
если(символ = ( )
увеличить счетчик;
иначе если(символ = ) )
уменьшить счетчик;
}
если(счетчик меньше нуля)
в_строке_ошибка;
перейти_к_следующему_символу;
}
если(счетчик не равен нулю)
в_строке_ошибка;
С уважением, AleX

Номер выпуска : 5310
Возраст листа : 952 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543563
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 30 Apr 2006 04:06:57 +0400 (#543563)

 

Сильно сомневаюсь, что возможно - хотя бы даже потому, что может быть
и такое выражение:
LowerCase((DateTimeToStr(Now)+")");
Выражение неверно, но пары скобок имеются.

Или
LowerCase(DateTimeToStr(Now)); // )
Выражение верно, но одна скобка лишняя.

Имхо, тут нужно два прохода, даже при подходе без регулярных выражений
- первым исключаем все ненужные скобки (вырезаем текст между каждой
нечётной и чётной кавычками, между символами /* и */ и всё что дальше
//).
- вторым реально считаем. Причём считать лучше всего навстречу - т.е.
сначала находишь открывающую скобку (запоминаешь индекс A), потом
начинаешь с конца, если находишь закрывающую, тоже запоминаешь но в B
и начинаешь опять искать с A. Если в процессе поиска B, ты доходишь до
A или натыкаешся на открывающую скобку - выражение неверно. Цикл
оканчивается положительно, когда при поиске очередной открывающей
скобки, ты доходишь до B, которая с самого начала должна быть равна
длине строки.

Провернуть всё это регулярными - нереально.

Номер выпуска : 5297
Возраст листа : 948 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/542018
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Wed, 26 Apr 2006 16:20:21 +0500 (#542018)

 

Здравствуйте, Neco!

А еще вот такое:
LowerCa)se(DateTim(eToStr(Now));
оно тоже пройдет тест, хотя неверно в принципе.
То есть, если счетчик до конца строки (или до // ) стал меньше нуля, то
строка с ошибкой.

По-моему можно обойтись дополнительной переменной "выключателем":
встретилась " или /* - не учитывать скобки до следующей " или */ .
А символы // можно воспринимать как конец строки.

С уважением, AleX

Номер выпуска : 5300
Возраст листа : 949 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/542702
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 27 Apr 2006 23:36:33 +0400 (#542702)

 

Привет AleX,

Ты мне в письме от 27 апреля 2006 г. (четверг) вон шо набрал
И я немного попишу:

Господа, помоему тут надо копать в сторону создания трансляторов.
Создаем описание выражений (языка) в расширенной форме Бекуса-Наура и
пишем трех-шаговый транслятор (лексический анализатор, синтаксический
анализатор и модуль выполнения). Который и решает все проблемы
правильного синтаксиса выражений.

Афоризм 1: Жизнь хитра! Когда у меня на руках все карты - она внезапно решает
играть в шахматы...
Афоризм 2: Основная ошибка в жизни - предположение о том, что люди действуют
на основе мыслительных процессов..
28 апреля 2006 г. 19:34:50

Работник мышки и клавиатуры,
просто студент и САПРист
Eugene the Monster

E-mail: mailto:rav***@o*****.ru
ICQ: 291-819-230
Web: www.hallo.nm.ru

Номер выпуска : 5305
Возраст листа : 951 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543236
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 28 Apr 2006 22:16:51 +0400 (#543236)