Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: $match size limit, suspicious (#B) behavior



[Sebastian Cc'd in case the list is still having indigestion over gmail MTAs]

On Sun, Oct 16, 2016 at 2:15 AM, Sebastian Gniazdowski
<sgniazdowski@xxxxxxxxx> wrote:
>
> Now code that matches either $var, ${var}, \$:
>
> while [[ "$mybuf" =
> (#b)([^\$\\]#)((#B)(\$([[:alpha:]_][[:alnum:]_]#|[[:digit:]]##)(\[[^[:space:]]#\])(#c0,1))|(\$[{](\([a-zA-Z0@%#]##\))(#c0,1)([[:alpha:]_][[:alnum:]_]#|[[:digit:]]##)(\[[^[:space:]]#\])(#c0,1)[}])|([\\][\'\"\$]))(#b)(*)
> ]]; do
>
> The problem: (#B) should have disabled all parentheses from where it
> is placed

What it looks like you're attempting to do is have
(#b)([^\$\\]#)((#B)....)(#b)(*) count as match[1] match[2] match[3]
without treating any of the more deeply nested parens inside the
match[2] pattern as backreferences?

That works with a very simple pattern:

% [[ 12345 = (#b)(?)((#B)(?)(?)(?))(#b)(?) ]]
% print -l :$^match
:1
:234
:5

The problem seems to be that the (#B) stops / (#b) implicitly resumes,
at the "|" in the second set of parens:

% [[ 12345 = (#b)(?)((#B)(?)|([[:alnum:]](#c0,1))(?))(#b)(*) ]]
% print -l :$^match
:1
:2
:
:
:345

If I add another set of parens around everything that follows (#B) up
to just before the close of the paren that opens before (#B), it looks
like what I expect:

% [[ 12345 = (#b)(?)((#B)((?)|([[:alnum:]](#c0,1))(?)))(#b)(*) ]]
% print -l :$^match
:1
:2
:345



Messages sorted by: Reverse Date, Date, Thread, Author