Особенности не жадных (non-greedy) регеспов в tcl/expect


ramok аватар

ramok - Posted on 28 Апрель 2015

В tcl/expect проблемы между переключениями между жадными и не жадными регеспами.
Например, попробуем распарсить первую строку, из двух заданных:

$ printf '123 first string\nsecond string\n' |
   expect -c 'log_user 0; expect -re {(\d+) (.+?)\n} {send_user "$expect_out(1,string) ~~~ $expect_out(2,string)\n"}'
123 ~~~ first string
second string

Как видно вторая группа (.+?) работает как жадная, хотя и указан ?.

Почему?

В man 3tcl re_syntax по этому поводу сказано:

Цитата:

The matching rules for REs containing both normal and non-greedy quantifiers have changed since early beta-test versions of this package. (The new rules are much simpler and cleaner, but do not work as hard at guessing the user's real intentions.)

Не очень информативно :)

Дело в том что жадность/не жадность регеспов задаётся первой группой с * или +.

$ printf '123 first string\nsecond string\n' |
  expect -c 'log_user 0; expect -re {(\d+?) (.+)\n} {send_user "$expect_out(1,string) ~~~ $expect_out(2,string)\n"}'
123 ~~~ first string

Тут (\d+?) сделан не жадным, хотя смысла в этом нет, но он задаёт все последующие группы быть не жадными тоже.

Что бы не ошибиться проще предполагать что не жадных регеспов в tcl/expect нет и обходить это ограничение как обычно, например:

$ printf '123 first string\nsecond string\n' |
  expect -c 'log_user 0; expect -re {(\d+) ([^\n]+)\n} {send_user "$expect_out(1,string) ~~~ $expect_out(2,string)\n"}'
123 ~~~ first string
0
Ваша оценка: Ничего

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.