agynr has asked for the wisdom of the Perl Monks concerning the following question:

What would be the most appropriate regular Expression to search the numbers with and without decimal.And if we had to replace that particular number with #. The length of the # would be the same as that of the length of the number. The decimal point should be intact there.
  • Comment on Replacing numbers using regular expression

Replies are listed 'Best First'.
Re: Replacing numbers using regular expression
by Zaxo (Archbishop) on Dec 22, 2004 at 08:17 UTC

    You can simply translate digits to '#':

    $_ = 123.4567890; tr/0-9/#/; print; __END__ ###.#######
    The regex to match digits-dot-digits looks like, my $fixed_point_re = qr/\d*\.?\d*/; but you also have to check that there is at least one digit, with m/\d/, since the regex has to allow for zero digits on either side of the optionsl decimal point.

    After Compline,
    Zaxo

      I think actually zero digits on the right side of the decimal point should not be allowed.

      1234.

      isn't what I think of as a number.

      I would allow zero digits on the left side though.

      .1234

      seems ok by me. I think the 123 in

      foo123foo

      shouldn't be a number, so let's look for white space, or the beginning/end of the line before and after our match. The end check can be taken care of with lookahead (?=\s|$). Unfortunately you can't have variable length lookbehind, so (?<=\s|$) is impossible. So I just do (\s|^) and you should skip this register and take the next parenthesized group for your match.

      Anyway we want to match all of these:

      1234
      1234.1234
      .1234

      but not

      .
      1234.
      1234.1234.1234
      .1234.1234
      foo123foo
      123.foo
      foo.123
      A regex that will do that is:

      my $fixed_point_re = qr/(\s|^)((\d+(\.\d+)?)|(\.\d+))(?=\s|$)/;
      It's getting kind of hard to read, I realize, but it sits plays dead and fetches so...

      Hope this helps!

      Thomas.

        A trailing decimal point with nothing to the right customarily says that trailing zeros of an integer are significant figures,

        1230 Three significant figures
        1230. Four significant figures

        There is nothing odd or unexpected about using that notation even where it is not needed.

        After Compline,
        Zaxo

        A reply falls below the community's threshold of quality. You may see it by logging in.
Re: Replacing numbers using regular expression
by Thilosophy (Curate) on Dec 22, 2004 at 08:15 UTC
    Do you just want to replace all digits in a string with # ? If so, try
    s/\d/\#/g;
    This turns 1234.5 into ####.#.

    If this is not what you want to do, please explain in more detail.

Re: Replacing numbers using regular expression
by amt (Monk) on Dec 22, 2004 at 15:06 UTC
    s/\d/\#/g;

    substitute d class with hash, globally in string. works as scalar string, float, or int.

    tested with: perl -e '$i=345.12; $i =~ s/\d/\#/gi; print "$i\n";'
    amt.

    perlcheat