LINUX.ORG.RU

Tcl : особенности regexp


0

0

Здравствуйте.

Вопрос такой: Почему 

regexp {(\([^()]+\))} (asdf)(asd(asdf(fgh)dg(fh))) Full F1;puts $F1

возвращает 

(asdf)

а

regexp "(\(\[^()\]+\))" (asdf)(asd(asdf(fgh)dg(fh))) Full F1;puts $F1

возвращает

asdf

?
Всмысле, почему второе выражение не возвращает то, что возвращает первое? Что нужно сделать, чтобы второе возвращало то, что возвращает первое (выражение со скобочками)?
anonymous

man re_syntax

> regexp {(\([^()]+\))} (asdf)(asd(asdf(fgh)dg(fh))) Full F1;puts $F1

Здесь круглыми скобками выделена часть regexp, которая потом кладётся в F1. Выражение понимается как "вернуть в первый аргумент то, что лежит внутри скобок и не содержит скобок внутри"

> regexp "(\(\[^()\]+\))" (asdf)(asd(asdf(fgh)dg(fh))) Full F1;puts $F1

А это выражение, после подстановки преобразуется в вид (([^()]+)) и понимается как "скобки, а внутри них строка, несодержащая скобок, которую надо вернуть"

> Всмысле, почему второе выражение не возвращает то, что возвращает первое?

Потому что regexp-ы разные.

> Что нужно сделать, чтобы второе возвращало то, что возвращает первое (выражение со скобочками)?

Надо правильно расставлять бэкслеши: "(\\\(\[^()\]+\\\))"

gaa ★★
()
Ответ на: комментарий от gaa

>man re_syntax

Нет у меня такого руководства, увы.

>Надо правильно расставлять бэкслеши: "(\\\(\[^()\]+\\\))"

Спасибо, идея ясна, но только непонятно, зачем третий слеш? Почему нельзя обойтись двумя?

anonymous
()
Ответ на: комментарий от anonymous

Re^2: Tcl : особенности regexp

>>man re_syntax

> Нет у меня такого руководства, увы.

Я его из activetcl-евских доков читаю.

>>Надо правильно расставлять бэкслеши: "(\\\(\[^()\]+\\\))"

> Спасибо, идея ясна, но только непонятно, зачем третий слеш? Почему нельзя обойтись двумя?

Можно. на самом деле тут третий роли не играет

gaa ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.