$str =~ /<regex-баланса-скобок>/
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



$str =~ /<regex-баланса-скобок>/ Expand / Collapse
Автор
Сообщение
10.02.2005 1:47
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.06.2006 15:18
Сообщ.: 7, Visits: 79
вопрос: возможен ли
$str =~ /некий-REGEX/
, возвращающий "совпадения" при условии:

1. $str может быть одно- или многострочной строкой
2. первый символ $str должен быть не пробельным
3. имеет место баланс скобок, либо их отсутствие

, например, в случае:

#########################
"
string0
stringA ()
nvl ((
select
months_between(sysdate,&due_dte)
from dual),0) &due_mnths_back ()
do funcB
-1 &some_flag_C
"
#########################

- желаемым результатом был бы массив из элементов:

@sol = (

"string0", # нуль скобок = баланс

"stringA ()", # баланс

"nvl (( # баланс в много-
select # строчной подстроке,
months_between(sysdate,&due_dte) # начатой с 1го `непробела`
from dual),0) &due_mnths_back ()", #

"-1 &some_flag_C" # нуль скобок = баланс

)

- т.е. с единственной отбракованной строкой
" do funcB" как не удовлетворяющий (2)
, и не являющийся продолжением nvl(.....

(посимвольная работа со стеком уже реализована (в C-подобном стиле)
и припасена на крайний случай как неприятная необходимость.)

заранее спасибо за помощь.
Сообщ. #856741
10.02.2005 9:33
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 13.07.2006 17:05
Сообщ.: 124, Visits: 1 356
Ну, как-то туманно вы объяснили задачу... Тем не менее попробую подсказать. Для начала - я думаю что операторы условия вам не нужны, а просто нужно создать шаблон регулярного выражения, которое будет пропускать только нужные вам значения.
Удобно в вашем примере использовать переменные $1 $2 и т.д.
То есть например:

###### string #########
good 123
bad AAA
good aaa
well
#######################

Можно пропарсить кодом, вида:

$string=~ m/(good [0-9]+)\s+(bad [A-Z]+)\s+(good [a-z]+)\s+(well)/g;

print "first: $1second $2third $3fourth $4";


PerlMonks.Org.Ru.... coming soon
Сообщ. #856769
10.02.2005 9:34
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 13.07.2006 17:05
Сообщ.: 124, Visits: 1 356
Да - забыл привести результат работы скрипта:

first: good 123
second bad AZD
third good abc
fourth well


PerlMonks.Org.Ru.... coming soon
Сообщ. #856770
14.03.2005 13:12
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
чем отлаживаете?
Сообщ. #861322
14.03.2005 13:47
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 13.07.2006 17:05
Сообщ.: 124, Visits: 1 356
Мне нравиться - отладчик из PDK от ActiveState. Если речь об этой отладке...

PerlMonks.Org.Ru.... coming soon
Сообщ. #861330
14.03.2005 14:17
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
PDK - это для perl, я имел ввиду отладку самих регулярных выражений в perl
Сообщ. #861335
14.03.2005 14:27
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 13.07.2006 17:05
Сообщ.: 124, Visits: 1 356
Отладку регвыражений... а чем-то можно отлажвать? каким-то инструментом? Неслышал об этом к сожалению :(.. Я так - тестирую разные варианты - засекаю среднюю скорость отработки скрипта...

PerlMonks.Org.Ru.... coming soon
Сообщ. #861338
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 11:04