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

Re: backreferences



On 10/15/2015 07:30 PM, Bart Schaefer wrote:
On Oct 15,  6:16pm, Ray Andrews wrote:
} Subject: Re: backreferences
}
}     if [[ "$sstring" = (#b)([(^(edcba))]*)(edcba)(*) ]];

Umm, no.
But ... but ... it worked. So it works for the wrong reason then you say. Ok
the right answer for the wrong reason could do a great deal of damage so
thanks for rescuing me.

[(^(edcba))] is still a character class (open paren, caret,
e,d,c,b,a, close paren).  Just (^(edcba)) without the square brackets.
And you have more parens then, so your $match[] indexes are wrong.

	if [[ "$sstring" = (#b)((^(edcba))*)(edcba)(*) ]]

There are 5 sets of parens, and you care about $match[1], $match[4],
and $match[5].  $match[2] is the prefix of $match[1] that was not
consumed by the middle *, and $match[3] is an empty substring of
$match[2] (because it was excluded from matching).  Count off the
open parens left to right to see this.
At the moment I'm quite confounded. So '(b#)' is looking at every set of '()' even
when nested and even when 'doing something else'? (That is to say even when
they are doing other syntax work?)  I may be doing something wrong but using
the above my output is:

one   abcde
two   edcba
three abcde
four
five


In fact you don't even need the middle * because (^edcba) will eat
an arbitrarily long string as long as it is not literally "edcba".
Well, that's the original question.

So you can reduce this to

	if [[ "$sstring" = (#b)(^edcba)(edcba)(*) ]]

and then you're back to only needing $match[1,3].

God knows.  But your simplified command works fine too, and I'll
take it on faith.  I've never seen any sort of 'any number of characters'
sort  of thing look other than:
[....]*
... so you can see where I'd go astray there.  Ok, so
^(edcba)
is individual character matches and
(^edcba)
is  anything up to "edcba" ... which is exactly what I wanted. Let's leave
my other effort to the devil--I don't even want to understand it.



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