下面的以下代码打印“ 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中的错误?我一直认为最长的比赛应该赢。
答案 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+
-匹配一个或多个数字
匹配的号码将存储在第一个捕获组中。