PDA

Показать полную графическую версию : [решено] *perl*|*regexp* как сделать регулярку?


pva
21-12-2014, 17:15
У меня почему-то не срабатывает регулярка. Возвращает 1, но переменные $&, $1-$4 не выставляет.

$templ="{asdasdasd}";
$templ=~m/\{\?|\!=|([\d]+)|([\w\-]+)|(\[[^\]]*\])|(\\[cwrnb])|[^\s\w\d{}]+| +|./gm

Заложенный смысл: нужно вычленить из текста английские слова, числа, текст обрамлённый скобками [..], пробелы, русские слова и односимвольные последовательности.
англ.слова, [..], числа и т.д. сложить в соотв. переменные $1-$4.

На javascript прокатывает, в перле - нет.

Drongo
22-12-2014, 01:41
pva, Я тут недавно подключал RegExp к C++ Builder 2010, всё в принципе работало с простыми регулярками. А потом решили оптимизировать и мне составили регулярку, которую никак не хочет понимать эта версия модуля регэкспов. Подключил билдеровский boost\regexp - всё норм.

Я бы попробовал от простого варианта, по частям реализоватьанглийские слова »
числа »
текст обрамлённый скобками [..] »
пробелы, русские слова и односимвольные последовательности »если всё сработает, то уже пробовать соединять всё в одну регулярку.

pva
22-12-2014, 08:44
Делал вот так:

if ($templ=~/\G\d+/gc) {
...
}
elsif ($templ=~/\G\w+/gc) {
...
}
elsif ($templ=~/\G\!=/gc) {
...
}
...

так работает. Но хочу свернуть код покороче, в одно регулярное выражение

pva
22-12-2014, 09:06
Нашёл! Не чистый эксперимент оказался. Дело в том, что я делал пару лексер-парсер, лексер выглядит так:

sub lex() { $templ=~/регулярка/g }

но при этом по возвращению из sub, видимо значения $&, $1-$4 сбрасываются. Помогло так:

my($tok,$num,$name,...);
sub lex() {
if ($templ=~/регулярка/g) {
($tok,$num,$name,..)=($&,$1,$2,...);
return 1;
}
}




© OSzone.net 2001-2012