(when (= me mb) (setq me (min l (1+ mb))))
;; Generate a replacement for the matched substring.
;; Operate on only the substring to minimize string consing.
- ;; Set up match data for the substring for replacement;
- ;; presumably this is likely to be faster than munging the
- ;; match data directly in Lisp.
- (string-match regexp (setq str (substring string mb me)))
+ ;; Translate the match data so that it applies to the matched substring.
+ (match-data--translate (- mb))
+ (setq str (substring string mb me))
(setq matches
(cons (replace-match (if (stringp rep)
rep
return Qnil;
}
+DEFUN ("match-data--translate", Fmatch_data__translate, Smatch_data__translate,
+ 1, 1, 0,
+ doc: /* Add N to all string positions in the match data. Internal. */)
+ (Lisp_Object n)
+{
+ CHECK_FIXNUM (n);
+ EMACS_INT delta = XFIXNUM (n);
+ if (EQ (last_thing_searched, Qt)) /* String match data only. */
+ for (ptrdiff_t i = 0; i < search_regs.num_regs; i++)
+ if (search_regs.start[i] >= 0)
+ {
+ search_regs.start[i] = max (0, search_regs.start[i] + delta);
+ search_regs.end[i] = max (0, search_regs.end[i] + delta);
+ }
+ return Qnil;
+}
+
/* Called from Flooking_at, Fstring_match, search_buffer, Fstore_match_data
if asynchronous code (filter or sentinel) is running. */
static void
defsubr (&Smatch_end);
defsubr (&Smatch_data);
defsubr (&Sset_match_data);
+ defsubr (&Smatch_data__translate);
defsubr (&Sregexp_quote);
defsubr (&Snewline_cache_check);
(match-beginning 1) (match-end 1)))
"babbcaacabc")
"b<abbc,0,4,1,3>a<ac,0,2,1,1><abc,0,3,1,2>"))
- )
+ ;; anchors (bug#15107, bug#44861)
+ (should (equal (replace-regexp-in-string "a\\B" "b" "a aaaa")
+ "a bbba"))
+ (should (equal (replace-regexp-in-string "\\`\\|x" "z" "--xx--")
+ "z--zz--")))
(provide 'subr-tests)
;;; subr-tests.el ends here