I recently came across the branch specifier in Vim regex builtins. Vim's help section on \& contains this:
A branch is one or more concats, separated by "\&".  It matches the last
concat, but only if all the preceding concats also match at the same
position.  Examples:
      "foobeep\&..." matches "foo" in "foobeep".
      ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob"
It's not clear how it is used and what it is used for. A good explanation of what it does and how it is used would be great.
To be clear this is not the & (replace with whole match) used in a substitution, this is the \& used in a pattern.
Example usage:
/\c\v([^aeiou]&\a){4}
Used to search for 4 consecutive consonants (Taken from vim tips).
Explanation:
\& is to \|, what the and operator is to the or operator. Thus, both concats have to match, but only the last will be highlighted.
Example 1:
(The following tests assume :setlocal hlsearch.)
Imagine this string:
foo foobar
Now, /foo will highlight foo in both words. But sometimes you just want to match the foo in foobar. Then you have to use /foobar\&foo.
That's how it works anyway. Is it often used? I haven't seen it more than a few times so far. Most people will probably use zero-width atoms in such simple cases. E.g. the same as in this example could be done via /foo\zebar.
Example 2:
/\c\v([^aeiou]&\a){4}.
\c - ignore case
\v - "very magic" (-> you don't have to escape the & in this case)
(){4} - repeat the same pattern 4 times
[^aeiou] - exclude these characters
\a - alphabetic character
Thus, this, rather confusing, regexp would match xxxx, XXXX, wXyZ or WxYz but not AAAA or xxx1. Putting it in simple terms: Match any string of 4 alphabetic characters that doesn't contain either 'a', 'e', 'i', 'o' or 'u'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With