Sunday, December 27, 2015

Apparent regex bug involving `\_.' (and other newline-matching constructs)

Given a file containing the following 2 lines...
1a3
123xyz

...try the following tests, and note the unexpected results.

Case 1.1:
call cursor(1, 1)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')
=> [1, 1, 2]

Case 1.2:
call cursor(1, 2)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')
=> [2, 1, 1]
Question: Why does the \_. not permit earlier match at cursor pos (1, 2)?
Note: Clearly, submatch should be 2, not 1, but this error is simply a
consequence of the first error: since match doesn't begin on 1st line,
the "a" at cursor pos can't be captured.

Case 1.3:
call cursor(1, 3)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')
=> [2, 1, 1]
Note: Why isn't a match found at cursor pos (1, 3)?

Repeat these tests with a \zs in the pattern, and note how the capture
is matched unconditionally...

Case 2.1:
call cursor(1, 1)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz', 'pcW')
=> [2, 4, 2]

Case 2.2:
call cursor(1, 2)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz', 'pcW')
=> [2, 4, 2]

Case 2.3:
call cursor(1, 3)
echo searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz', 'pcW')
=> [2, 4, 2]
Note: Submatch should be 1, not 2, here. It's as though the \zs forces the
capture to match unconditionally.

Points to note... Originally, I thought the error had to do with the 'p' flag, but that appears not to be the case: the submatch errors are simply a consequence of the incorrectly determined start locations. Also, it appears the results would have been the same with * as they were with \{-}. Finally, the unexpected behavior is not limited to \_., but is seen even when (e.g.) explicit \n is used.

Thanks,
Brett Stahlman

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: