Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] *perl*|*regexp* как сделать регулярку? (http://forum.oszone.net/showthread.php?t=292858)

pva 21-12-2014 17:15 2446443

*perl*|*regexp* как сделать регулярку?
 
У меня почему-то не срабатывает регулярка. Возвращает 1, но переменные $&, $1-$4 не выставляет.
Код:

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

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

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

Drongo 22-12-2014 01:41 2446659

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

Я бы попробовал от простого варианта, по частям реализовать
Цитата:

Цитата pva
английские слова »

Цитата:

Цитата pva
числа »

Цитата:

Цитата pva
текст обрамлённый скобками [..] »

Цитата:

Цитата pva
пробелы, русские слова и односимвольные последовательности »

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

pva 22-12-2014 08:44 2446709

Делал вот так:
Код:

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

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

pva 22-12-2014 09:06 2446712

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

sub lex() { $templ=~/регулярка/g }
но при этом по возвращению из sub, видимо значения $&, $1-$4 сбрасываются. Помогло так:
Код:

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



Время: 21:08.

Время: 21:08.
© OSzone.net 2001-