Fix search/replace for the replacement not to change search results
commitc83a93eb65ea102ebe1f577593a3d9a9c4152aaf
authorColomban Wendling <ban@herbesfolles.org>
Mon, 24 Dec 2012 02:20:17 +0000 (24 03:20 +0100)
committerColomban Wendling <ban@herbesfolles.org>
Sun, 24 Mar 2013 14:50:22 +0000 (24 15:50 +0100)
tree8827e472a3294b53c80019f25ef4bd017a524b89
parent01916596638a0bfef54386d2e24fc762ff7217c9
Fix search/replace for the replacement not to change search results

Fix the search & replace algorithm to make sure a replacement won't
possibly affect the next one (e.g. in case of lookahead and lookbehind
regular expressions).

To do so, first find all occurrences and only then perform replacements,
instead of doing both together.

This fixes searching/replacing of any pattern that may be affected by
its replacement (e.g. patterns that look for something not a character
in the match range), including:

 * Start/end of line:
   Before this change, searching with regular expression "^A" and
   replacing with an empty string on the input "AA" would have resulted
   in an empty output ("^A" matching again after removing the first
   one).  Now it properly only removes the leading "A".
 * Lookahead/lookbehind:
   Pattern "(?<=a)b" with empty replacement and input "abb" would have
   resulted in the output "a" instead of "ab".
 * And more generally, many patterns matching non-characters like
   positions or out-of-match characters.
src/search.c