all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Regex replace for numbers
@ 2014-10-03  0:33 Robert Thorpe
  2014-10-03  1:07 ` Marcin Borkowski
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Robert Thorpe @ 2014-10-03  0:33 UTC (permalink / raw)
  To: help-gnu-emacs

I'm not very good with Emacs regex, I need to search-and-replace on some numbers.

How can I detect unnecessary zeros at the end of a number and chop them
off?  E.g. turn 567.45000 to 567.45 without also turning 6700 to 67.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03  0:33 Regex replace for numbers Robert Thorpe
@ 2014-10-03  1:07 ` Marcin Borkowski
  2014-10-03  1:41   ` Robert Thorpe
  2014-10-03  5:25 ` Nicolas Richard
       [not found] ` <mailman.10347.1412313926.1147.help-gnu-emacs@gnu.org>
  2 siblings, 1 reply; 8+ messages in thread
From: Marcin Borkowski @ 2014-10-03  1:07 UTC (permalink / raw)
  To: help-gnu-emacs


On 2014-10-03, at 02:33, Robert Thorpe wrote:

> I'm not very good with Emacs regex, I need to search-and-replace on some numbers.
>
> How can I detect unnecessary zeros at the end of a number and chop them
> off?  E.g. turn 567.45000 to 567.45 without also turning 6700 to 67.

What about

M-%
\([0-9]+\)\.\([0-9]*?\)0+   RET
\1.\2    RET

?

> BR,
> Robert Thorpe

Hth,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03  1:07 ` Marcin Borkowski
@ 2014-10-03  1:41   ` Robert Thorpe
  2014-10-03  2:45     ` Yuri Khan
  0 siblings, 1 reply; 8+ messages in thread
From: Robert Thorpe @ 2014-10-03  1:41 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs

Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:
> On 2014-10-03, at 02:33, Robert Thorpe wrote:
>
>> I'm not very good with Emacs regex, I need to search-and-replace on some numbers.
>>
>> How can I detect unnecessary zeros at the end of a number and chop them
>> off?  E.g. turn 567.45000 to 567.45 without also turning 6700 to 67.
>
> What about
>
> M-%
> \([0-9]+\)\.\([0-9]*?\)0+   RET
> \1.\2    RET

That needs C-M-%, regexp-replace.  If I have a number like 456.0040 then
it replaces the first two zeros giving 456.40, which is wrong.  It seems
that shortest-match regexps aren't very useful here.  If I remove the ?
in the regexp then it works, but it only removes one layer of zeros at a
time, so e.g. 567.45000 becomes 567.4500.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03  1:41   ` Robert Thorpe
@ 2014-10-03  2:45     ` Yuri Khan
  0 siblings, 0 replies; 8+ messages in thread
From: Yuri Khan @ 2014-10-03  2:45 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs@gnu.org, Marcin Borkowski

On Fri, Oct 3, 2014 at 8:41 AM, Robert Thorpe
<rt@robertthorpeconsulting.com> wrote:

>> \([0-9]+\)\.\([0-9]*?\)0+   RET
>> \1.\2    RET
>
> That needs C-M-%, regexp-replace.  If I have a number like 456.0040 then
> it replaces the first two zeros giving 456.40, which is wrong.  It seems
> that shortest-match regexps aren't very useful here.  If I remove the ?
> in the regexp then it works, but it only removes one layer of zeros at a
> time, so e.g. 567.45000 becomes 567.4500.

So what you need to match is a string of digits, then a decimal point,
then a non-greedy string of digits, then a (possibly empty but greedy)
string of zeros, and finally an end of word.

\([0-9]+\.[0-9]*?\)0+\> replace with \1

Note that this won’t touch instances which have a letter immediately after it:

1234.5678000s

If you want that too, try this:

\([0-9]+\.[0-9]*?\)0+\([^0-9]|\') replace with \1\2



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03  0:33 Regex replace for numbers Robert Thorpe
  2014-10-03  1:07 ` Marcin Borkowski
@ 2014-10-03  5:25 ` Nicolas Richard
       [not found] ` <mailman.10347.1412313926.1147.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 8+ messages in thread
From: Nicolas Richard @ 2014-10-03  5:25 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs

Robert Thorpe <rt@robertthorpeconsulting.com> writes:

> I'm not very good with Emacs regex, I need to search-and-replace on some numbers.
>
> How can I detect unnecessary zeros at the end of a number and chop them
> off?  E.g. turn 567.45000 to 567.45 without also turning 6700 to 67.

Instead of solving it with a regexp, I suggest some lisp :

(save-excursion
  (goto-char (point-min))
  (while (re-search-forward "[0-9]" nil t )
    (let ((bounds (bounds-of-thing-at-point 'sexp))
          (number (number-at-point)))
      (when number
        (delete-region (car bounds) (cdr bounds))
        (insert (format "%s" number))))))

(This might not work in modes other than emacs-lisp mode, due to how
number-at-point works.)

you can test it on :

foo0
5054.210
567.45000
567.04500
127.0.1.0
500
005

and get:

foo0
5054.21
567.45
567.045
127.0.1.0
500
5

-- 
Nicolas Richard



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
       [not found] ` <mailman.10347.1412313926.1147.help-gnu-emacs@gnu.org>
@ 2014-10-03 11:43   ` Udyant Wig
  2014-10-03 14:40     ` Nicolas Richard
  0 siblings, 1 reply; 8+ messages in thread
From: Udyant Wig @ 2014-10-03 11:43 UTC (permalink / raw)
  To: help-gnu-emacs

Nicolas Richard <theonewiththeevillook@yahoo.fr> writes:
| Instead of solving it with a regexp, I suggest some lisp :
| 
| (save-excursion
|   (goto-char (point-min))
|   (while (re-search-forward "[0-9]" nil t )
|     (let ((bounds (bounds-of-thing-at-point 'sexp))
|           (number (number-at-point)))
|       (when number
|         (delete-region (car bounds) (cdr bounds))
|         (insert (format "%s" number))))))
| 
| (This might not work in modes other than emacs-lisp mode, due to how
| number-at-point works.)

 Is there a way to save the major-mode of the buffer before entering the
 above code, change to emacs-lisp-mode and then to enable the original
 major-mode again?

| <snip tests>

-- 
Udyant Wig
GitHub:    https://github.com/udyant
Poetry:    http://www.writing.com/main/profile/biography/frosthrone


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03 11:43   ` Udyant Wig
@ 2014-10-03 14:40     ` Nicolas Richard
  2014-10-03 19:22       ` Robert Thorpe
  0 siblings, 1 reply; 8+ messages in thread
From: Nicolas Richard @ 2014-10-03 14:40 UTC (permalink / raw)
  To: Udyant Wig; +Cc: help-gnu-emacs

Udyant Wig <udyantw@gmail.com> writes:
>  Is there a way to save the major-mode of the buffer before entering the
>  above code, change to emacs-lisp-mode and then to enable the original
>  major-mode again?

You don't really need to do that. Simply using the syntax table should
be sufficient in this case :

(with-syntax-table emacs-lisp-mode-syntax-table
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "[0-9]" nil t )
      (let ((bounds (bounds-of-thing-at-point 'sexp))
            (number (number-at-point)))
        (when number
          (delete-region (car bounds) (cdr bounds))
          (insert (format "%s" number)))))))

-- 
Nicolas Richard



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Regex replace for numbers
  2014-10-03 14:40     ` Nicolas Richard
@ 2014-10-03 19:22       ` Robert Thorpe
  0 siblings, 0 replies; 8+ messages in thread
From: Robert Thorpe @ 2014-10-03 19:22 UTC (permalink / raw)
  To: Nicolas Richard; +Cc: help-gnu-emacs, udyantw

Nicolas Richard <theonewiththeevillook@yahoo.fr> writes:

> Udyant Wig <udyantw@gmail.com> writes:
>>  Is there a way to save the major-mode of the buffer before entering the
>>  above code, change to emacs-lisp-mode and then to enable the original
>>  major-mode again?
>
> You don't really need to do that. Simply using the syntax table should
> be sufficient in this case :
>
> (with-syntax-table emacs-lisp-mode-syntax-table
>   (save-excursion
>     (goto-char (point-min))
>     (while (re-search-forward "[0-9]" nil t )
>       (let ((bounds (bounds-of-thing-at-point 'sexp))
>             (number (number-at-point)))
>         (when number
>           (delete-region (car bounds) (cdr bounds))
>           (insert (format "%s" number)))))))

Thanks everyone.  I'll try the elisp solution and the regexps solution.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-10-03 19:22 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-03  0:33 Regex replace for numbers Robert Thorpe
2014-10-03  1:07 ` Marcin Borkowski
2014-10-03  1:41   ` Robert Thorpe
2014-10-03  2:45     ` Yuri Khan
2014-10-03  5:25 ` Nicolas Richard
     [not found] ` <mailman.10347.1412313926.1147.help-gnu-emacs@gnu.org>
2014-10-03 11:43   ` Udyant Wig
2014-10-03 14:40     ` Nicolas Richard
2014-10-03 19:22       ` Robert Thorpe

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.