Regex 为什么这个正则表达式在Perl中不匹配?

Regex 为什么这个正则表达式在Perl中不匹配?,regex,string,perl,Regex,String,Perl,我有一个字符串,可以读像这样的东西,虽然不总是,数字可以变化 Board Length,45,inches,color,board height,8,inches,black,store,wal-mart,Board weight,20,dollars 我试图匹配这个正则表达式中跟在线路板长度后面的45 if ($string =~/Board Length,(\d+\.\d+)/){ print $string; } 格式错误吗?我认为d+将匹配所需的任意多个数字。将匹配文字“

我有一个字符串,可以读像这样的东西,虽然不总是,数字可以变化

Board Length,45,inches,color,board height,8,inches,black,store,wal-mart,Board weight,20,dollars
我试图匹配这个正则表达式中跟在线路板长度后面的45

if ($string =~/Board Length,(\d+\.\d+)/){

    print $string;

}

格式错误吗?我认为d+将匹配所需的任意多个数字。将匹配文字“.”,如果有小数,d+将匹配小数后的任何数字。

正如您所说的,小数。以下数字为必填项。因此\.\d+?为了让它成为可选的

if ($string =~/Board Length,(\d+(?:\.\d+)?)/)

正如你所说,十进制。以下数字为必填项。因此\.\d+?为了让它成为可选的

if ($string =~/Board Length,(\d+(?:\.\d+)?)/)

你完全正确地认为应该匹配什么。但是,如果没有“?”字符,则指定所有这些片段都必须存在

\d+\.\d+
这意味着1个或多个数字、句点、1个或多个数字

1.5、253333.7、0.0将全部匹配。但是,您的示例使用了45,它没有。在它里面,也没有后面的数字。对于您的问题,有几种解决方案,mpapac在上文中给出了最充分的证明。允许小数和后面的数字是可选的

(\.\d+)?
这样做的问题是,在它周围放置一个标记会使它成为另一个捕获组。你可能想要,也可能不想要。将?:放在其中意味着将其作为一个组使用,但不要捕获它。因此:

(?:\.\d+)?
另一个选项是不进行分组,而是使小数本身可选,并使小数点后的数字为零或多个,而不是一个或多个。看起来是这样的:

\d+\.?\d*

你完全正确地认为应该匹配什么。但是,如果没有“?”字符,则指定所有这些片段都必须存在

\d+\.\d+
这意味着1个或多个数字、句点、1个或多个数字

1.5、253333.7、0.0将全部匹配。但是,您的示例使用了45,它没有。在它里面,也没有后面的数字。对于您的问题,有几种解决方案,mpapac在上文中给出了最充分的证明。允许小数和后面的数字是可选的

(\.\d+)?
这样做的问题是,在它周围放置一个标记会使它成为另一个捕获组。你可能想要,也可能不想要。将?:放在其中意味着将其作为一个组使用,但不要捕获它。因此:

(?:\.\d+)?
另一个选项是不进行分组,而是使小数本身可选,并使小数点后的数字为零或多个,而不是一个或多个。看起来是这样的:

\d+\.?\d*

您没有打印您捕获的内容。您正在打印美元,我们不知道它是什么

if ($string =~/Board Length,(\d+\.\d+)/){
    print $_;
}
我想你想要的是:

if ($string =~/Board Length,(\d+\.\d+)/){
    print $1;
}

您没有打印您捕获的内容。您正在打印美元,我们不知道它是什么

if ($string =~/Board Length,(\d+\.\d+)/){
    print $_;
}
我想你想要的是:

if ($string =~/Board Length,(\d+\.\d+)/){
    print $1;
}

您有以下表达式:

$string =~/Board Length,(\d+\.\d+) /
您的字符串是:

Board Length,45,inches
线板长度将与图案板长度匹配,。然而,我们模式的其余部分是匹配一个或多个数字,后跟一个周期,后跟一个或多个数字。这与字符串45不匹配。那里没有小数点

问题是你想匹配什么。例如,如果数字被逗号包围,则可以执行以下操作:

$string =~ /Board Length,([^,]+),/;
my $number = $1;
[^,]的意思不是逗号。您正在捕获从一个逗号到下一个逗号的所有内容。这将允许您捕获45、45.32甚至4.5e+10。两个逗号之间的任何字符

请注意,第一个捕获组使用$1,而不是$

另一种方法是使用非贪婪匹配:

$string =~ /Board Length,(.+?),/;
my $number = $1;
如果捕获的不是数字,会发生什么?您可以使用Scalar::Util中的looks_like_number函数进行测试,Scalar::Util已包含在Perl发行版中很长一段时间了

use Scalar::Util    qw(looks_like_number);

my $string = "Board Length,Extra long,feet,...";
...
$string =~ /Board Length,(.+?),/;
my $number = $1;

if ( looks_like_number( $number ) ) {
    print "$number is a number\n";
}
else {
    print "Nope. $number isn't a number\n";
}

您有以下表达式:

$string =~/Board Length,(\d+\.\d+) /
您的字符串是:

Board Length,45,inches
线板长度将与图案板长度匹配,。然而,我们模式的其余部分是匹配一个或多个数字,后跟一个周期,后跟一个或多个数字。这与字符串45不匹配。那里没有小数点

问题是你想匹配什么。例如,如果数字被逗号包围,则可以执行以下操作:

$string =~ /Board Length,([^,]+),/;
my $number = $1;
[^,]的意思不是逗号。您正在捕获从一个逗号到下一个逗号的所有内容。这将允许您捕获45、45.32甚至4.5e+10。两个逗号之间的任何字符

请注意,第一个捕获组使用$1,而不是$

另一种方法是使用非贪婪匹配:

$string =~ /Board Length,(.+?),/;
my $number = $1;
如果捕获的不是数字,会发生什么?您可以使用Scalar::Util中的looks_like_number函数进行测试,Scalar::Util已包含在Perl发行版中很长一段时间了

use Scalar::Util    qw(looks_like_number);

my $string = "Board Length,Extra long,feet,...";
...
$string =~ /Board Length,(.+?),/;
my $number = $1;

if ( looks_like_number( $number ) ) {
    print "$number is a number\n";
}
else {
    print "Nope. $number isn't a number\n";
}

是的,在我发布这篇文章后,我发现了一些。谢谢。是的,我在发了这篇文章之后才注意到这一点。谢谢