PERL正则表达式 - 返回结果不包括条件语句

时间:2014-01-17 15:45:34

标签: regex perl

我是正则表达式的新手,我有一个正则表达式有用的场景。

我的要求非常简单,我要检测字符串中是否存在单词NET,并提取其后面的数字,而不包括单词NET或其后面的空格。

在我的特殊情况下,在NET之后是几个空白字符,并且这些字符的数量可以随着它们用作填充而变化。

我的输入字符串如下

NET       4.800 g

我编造的reg ex如下

(?<=NET)\s*(\d{0,4}\.\d{1,3})

这会产生接近我正在尝试的结果。

它对字符NET执行正向预测,然后匹配随后的空白字符数。最后,我选择最多四位数,一个句号和最多三位数字。

问题在于我在数字之前抓住了不确定数量的填充空格。我真正想要的就是它自己的数字。

我确实尝试将\ s *放入前瞻,但这失败了。有没有人对我在哪里出错有任何建议?

1 个答案:

答案 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并捕获其后的数字。这可以发生在字符串中的任何位置,甚至可以部分匹配。