我有一个像这样的变量
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。
答案 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;
}