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
Post a Comment