我是正则表达式的新手,我有一个正则表达式有用的场景。
我的要求非常简单,我要检测字符串中是否存在单词NET,并提取其后面的数字,而不包括单词NET或其后面的空格。
在我的特殊情况下,在NET之后是几个空白字符,并且这些字符的数量可以随着它们用作填充而变化。
我的输入字符串如下
NET 4.800 g
我编造的reg ex如下
(?<=NET)\s*(\d{0,4}\.\d{1,3})
这会产生接近我正在尝试的结果。
它对字符NET执行正向预测,然后匹配随后的空白字符数。最后,我选择最多四位数,一个句号和最多三位数字。
问题在于我在数字之前抓住了不确定数量的填充空格。我真正想要的就是它自己的数字。
我确实尝试将\ s *放入前瞻,但这失败了。有没有人对我在哪里出错有任何建议?
答案 0 :(得分:3)
我怀疑您使用$&
来捕获字符串,而不是$1
。变量$&
包含整个匹配字符串,然后包含您的空格,但不包括您的lookbehind断言。这听起来像你的问题描述:你需要排除可变数量的空格,但是你得到的错误是“不支持可变长度的lookbehind断言”。
如果您已包含代码,这将是一个非常容易回答的问题。你应该总是这样做:总是显示。
所以...我假设你有类似的东西:
if (/your_regex/) {
$match = $&;
}
然后你应该把它改成
if (/your_regex/) {
$match = $1;
}
这样,只会捕获括号内的字符串,并且会丢弃它外面的\s*
。
通过这种正确的匹配方式(也可以更简单的方式),您可以简化正则表达式。显示严格且灵活的版本:
use strict;
use warnings;
use Data::Dumper;
my $str = "NET 4.800 g";
my ($number) = $str =~ /^NET\s*(\d{0,4}\.\d{0,3})\sg$/; # strict match
print Dumper $number; # $VAR1 = '4.800';
my ($simple) = $str =~ /NET\s*([\d.]+)/; # flexible match
print Dumper $simple; # $VAR1 = '4.800';
在严格匹配中,我们在开始^
和结束$
时使用锚点。我们确保字符串以NET
开头,以g
结尾,并说明我们希望在之间找到的确切数字和空格。
灵活匹配只需查找NET
并捕获其后的数字。这可以发生在字符串中的任何位置,甚至可以部分匹配。