21.5.28: replace-regexp-in-string with SUBEXP is broken
David Kastrup
dak at gnu.org
Sat Sep 22 16:44:53 EDT 2007
"Stephen J. Turnbull" <stephen at xemacs.org> writes:
> Ville Skyttä writes:
>
> > replace-regexp-in-string with SUBEXP in 21.5.28 is broken; for example the
> > example given in the docstring fails.
>
> The whole Emacs matching API really sucks. :-(
>
> > What should happen according to the example:
> >
> > (replace-regexp-in-string "\\(foo\\).*\\'" "bar" " foo foo" nil nil 1)
> > " bar foo"
Does so in Emacs.
> but this is only used in the rare case that rep is a function. I
> actually don't think this makes sense. Consider this example:
>
(defun rep (s)
(if (string= s "foo") "bar" s))
(replace-regexp-in-string "\\(foo\\).*\\'" 'rep " foo foo" nil nil 1)
> I would expect that to result in " bar foo", but as written here (and
> as specified in the docstring) that results in " foo foo" because
> (match-string 0 str) is " foo foo" here. We should look at GNU's
> implementatation to see what they do.
" foo foo foo". It is possible that this may be a bug, but the DOC
string of replace-regexp-in-string makes my eyes glaze over, anyway.
If you have a good definite idea about what would be the correct
behavior and why, and you care about keeping code divergence to a
minimum, you might make and report a test case.
> For another thing, I discovered either `match-end' or `\'' appears
> broken on strings:
>
> (let ((s " foo foo"))
> ;; my-rris is `replace-regexp-in-string' without saving match data
> (list (my-rris "\\(foo\\).*\\'" "bar" s nil nil 1)
> (match-string 0 s)
> (match-string 1 s)
> (length s)
> (match-beginning 0)
> (match-end 0)
> (match-beginning 1)
> (match-end 1)))
> => (" bar" " foo fo" " fo" 8 0 7 0 3)
>
> The first element is the bug that Ville reported but the rest is,
> well, disturbing. Anybody know what's going on here?
Emacs: (" bar foo" " foo fo" " fo" 8 0 7 0 3)
I am not sure about the relevance of "rris without match-data" though.
--
David Kastrup, Kriemhildstr. 15, 44793 Bochum
More information about the XEmacs-Beta
mailing list