如何匹配数字而不是字符串和数字?

时间:2016-02-11 02:21:34

标签: regex perl

我有一个像这样的变量

p <= 0;
p <= q0;

我想只获得行p <= q0而不是p <= 0所以我使用下面的代码来获取除数字之外的东西,但它也不能得到q0,因为在q后面有一个数字。

if ($string2 =~ m/^(.*)(<=)(.*)(;)/g) {
     unless ($3 =~ /[0-9]/) {
        push @des, $1;
        push @source, $3;
     }
}

这是匹配这两行的代码的一部分。 $ string 2首先是p&lt; = 0,然后是p&lt; = q0。

3 个答案:

答案 0 :(得分:1)

使用正则表达式最简单的方法是检查$3是否与任何字母都不匹配....

if ( $3 !~ /[A-z]/) { ... }

如果您只想检查$3是否与数字相符,请使用looks_like_number ...它位于核心。

use Scalar::Util 'looks_like_number';

# Later...

if ( $string2 =~ m/^(.*)(<=)(.*)(;)/g ) {
    if ( looks_like_number($3) ) {
        push @des, $1;
        push @source, $3;
    }
}

修改

忘记指出一旦你进行另一次正则表达式匹配,就会丢失临时捕获变量(例如$1$2等)。

使用命名捕获来解决这个问题。此外,我怀疑您不需要捕获<=;。如果是这种情况,那么您不需要将它们用括号括起来。

if ( $string2 =~ m/^(?<des>.*) <= (?<source>.*);/ ) {
    if ( $+{source} !~ /[A-z]/) {
        push @des, $+{des};
        push @source, $+{source};
    }
}

答案 1 :(得分:0)

if($string2=~m/^([a-z,0-9]+)\s*(<=)\s*([a-z,0-9]+)(;)/g){
     my $d=$1;   
     my $s=$3;
     if ($3 =~ /[a-z]/){  
        push @des, $d;
        push @source, $s;
     }
}

答案 2 :(得分:0)

您可以只使用一场比赛来完成,具体取决于您想要的内容。如果你想匹配右边是以字母开头的标识符,那么这将起作用:

if ($string2 =~ m/^(.*)<=\s*([a-z]\w*)\s*;/gi) {
    push @des, $1;
    push @source, $2;
}