与单词边界一起使用时,Perl Regexp :: Common程序包与某些实数不匹配

时间:2019-05-13 05:33:54

标签: regex perl pcre

下面的以下代码打印“ 34”,而不是预期的“ .34”

use strict;
use warnings;

use Regexp::Common;

my $regex = qr/\b($RE{num}{real})\s*/;
my $str = "This is .34 meters of cable";

if ($str =~ /$regex/) {
    print $1;
}

我需要修复我的正则表达式吗? (需要使用单词边界,因为它不包含它会导致它与诸如xx34之类的字符串匹配,但我不想这样做)

还是Regexp :: Common中的错误?我一直认为最长的比赛应该赢。

2 个答案:

答案 0 :(得分:2)

字边界是上下文相关的正则表达式构造。当其后跟一个单词char(字母,数字或_)时,此位置应以字符串开头或非单词char开头。在这种具体情况下,单词边界后面是非单词char,因此要求单词char出现在此字符之前。

您可以使用在后面带有负向表示的明确词边界:

my $regex = qr/(?<!\w)($RE{num}{real})/;
               ^^^^^^^

后面的(?<!\w)否定性含义始终表示一件事:如果存在则失败  当前位置的左侧没有单词字符。

或者,如果希望只在空格或字符串开头之后进行匹配,请使用空格边界:

my $regex = qr/(?<!\S)($RE{num}{real})/;
               ^^^^^^^

答案 1 :(得分:0)

尝试以下方式:(?:^| )(\d*\.?\d+)

说明:

(?:...)-非捕获组

^|-匹配^-字符串开头或-空格

\d*-匹配零个或多个数字

\.?-从字面上匹配点-零或一

\d+-匹配一个或多个数字

匹配的号码将存储在第一个捕获组中。

Demo