help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: string-replace question -- changing names like variable_name to var


From: lawrence mitchell
Subject: Re: string-replace question -- changing names like variable_name to variableName
Date: Tue, 03 Sep 2002 15:39:40 +0100
User-agent: Gnus/5.090007 (Oort Gnus v0.07) Emacs/21.2.90 (i386-mingw-windows98.2222)

bc wrote:

[...] variable_name --> variableName
> Is there an easier way to do this short of some lisp like:
> (replace-string "_a" "A")
> (replace-string "_A" "A")
> (replace-string "_b" "B")
> etc.

Why yes there is.  Using a small amount of knowledge of regexps,
and a few other Emacs functions.

Note firstly, that the docstring of replace-string explicitly
recommends against its use in lisp programs:

/----[ C-h f replace-string RET ]
| This function is usually the wrong thing to use in a Lisp program.
| What you probably want is a loop like this:
|   (while (search-forward FROM-STRING nil t)
|     (replace-match TO-STRING nil t))
| which will run faster and will not set the mark or print anything.
\----

However, neither replace-string nor search-forward allow the use
of regexps in their syntax, hence, we need to use the regexp
equivalents, namely re-search-forward

Using these bits of information, we come up with
something like:

(let ((case-fold-search nil))           ; make sure we don't ignore
                                        ; case in our search, if this
                                        ; isn't a problem, then change
                                        ; the nil on this line to t.
  (while (re-search-forward             ; search forward for a regular
                                        ; expression.

          "\\([a-z]\\)_\\([a-z]\\)"     ; this regexp matches
                                        ; something of the form:
                                        ; foo_bar, but not _bar, or
                                        ; foo_. If you want to match
                                        ; capitalised letters add A-Z
                                        ; to the character
                                        ; groupings. Or change the
                                        ; binding of case-fold-search
                                        ; to t.

          nil                           ; no bound on the search

          t)                            ; don't error if the match is
                                        ; not found.

    (replace-match                      ; replace the matched text with:

     (concat (match-string 1)           ; a concatenation of the 1st
                                        ; \\(..\\) grouping. and...
             (upcase                    ; the uppercase equivalent of:

              (match-string 2)))        ; the 2nd \\(..\\) grouping.

     t)))                               ; since we've gone to all the
                                        ; trouble of changing the
                                        ; case, treat our string as FIXEDCASE

I hope the comments are suitably explanatory.

-- 
lawrence mitchell <wence@gmx.li>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]