regex - Matching all the numbers -


i asked in topic matching numbers 123. narrow , deeper regex see have define anything. asked exponential notation , got answer in this post: /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[ee]-?(?:\d+|\d*\.\d*))?)/. tried understand failed far.

so ask more specific now. need match numbers, give examples here:

13 -999 83.12300 .151 -.213 1e14 124e2 -9e-4 

you got it, regular math stuff.

and more specific give perl code this. searching keyword on line , need value line. i'd value in 1 regex because workaround or-statement || seems cause problems.

my $value; open(file,"data.dat") or die "error on opening data: $!\n"; while (my $line = <file>) {         if (($line =~ /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[ee]-?(?:\d+|\d*\.\d*))?)/x) || ($line =~ /^keyword\s*(\d*\.\d*)/)) {                 $value = $1;         }; } close(file); 

edit

thx hints far.

there way this, , don't need regular expressions it. can use looks_like_number scalar::util

here's example: how tell if variable has numeric value in perl? pasted here you.


example:

#!/usr/local/bin/perl  use warnings; use strict;  use scalar::util qw(looks_like_number);  @exprs = qw(1 5.25 0.001 1.3e8 foo bar 1dd);  foreach $expr (@exprs) {     print "$expr is", looks_like_number($expr) ? '' : ' not', " number\n"; } 

gives output:

1 number 5.25 number 0.001 number 1.3e8 number foo not number bar not number 1dd not number 

edit: @borodin's comment

you use in way this:

my $value; open(file,"data.dat") or die "error on opening data: $!\n"; while (my $line = <file>) {         if (($line =~ /^keyword +(.*)/)) {              $number = $1;              if ( looks_like_number($number) ) {                   $value = $number;              }         }; } 

edit: if have have regex, can expression this:

 #!/bin/perl  use strict;  use warnings;   @numbers = ( 'keyword 13',                  ' word   25',                  'keyword -999',                  'keyword 83.12300',                  'keyword  .151',                  'keyword -.213',                  'keyword 1e14',                  'keyword 124e2',                  'keyword -9e-4 ',                  ' keyword  e43e',                  'keyword 4.5.6',                  'keyword 4..e',                  'keyword nan',                  'keyword inf');   (@numbers) {        if ( /^keyword +(-?((\d+\.?\d*)|(\d*\.?\d+))([ee]-?\d+)?)/ ) {           print "$1 number\n";       } else {          print "$_ not match keyword or not number\n";      }   } 

Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -