Perl正则表达式|从右边开始匹配

时间:2013-01-16 13:30:53

标签: regex perl

我正在尝试解析OID并提取#18但我不确定如何使用点作为分隔符来编写它从右到左计数:

1.3.6.1.2.1.31.1.1.1.18.10035

此正则表达式将获取最后一个值

my $ifindex = ($_=~ /^.*[.]([^.]*)$/);

我还没有找到一种方法来调整它以获得我需要的值。

4 个答案:

答案 0 :(得分:5)

怎么样:

my $str = "1.3.6.1.2.1.31.1.1.1.18.10035";
say ((split(/\./, $str))[-2]);

<强>输出:

18

答案 1 :(得分:3)

如果格式始终相同(即始终从右起第二位),则可以使用: -

m/(\d+)\.\d+$/;

..答案最终将在:$1

或者另一种方法是将字符串拆分为点上的数组并检查数组中的倒数第二个值。

答案 2 :(得分:1)

您需要的更简单:

my $ifindex;

if (/(\d+)\.\d+$/)
{
   $ifindex = $1;
}

几条评论:

  1. 您不需要匹配整个字符串,只需要匹配您关注的部分。因此,无需使用^锚定到开头并使用.*。锚定到最后。
  2. [.]是一个字符类,用于匹配字符组。例如,[abc]将匹配a,b或c。匹配单个字符时应该避免;只是匹配那个角色。在这种情况下,您需要转义它,因为它是一个特殊字符:\.
  3. 我根据你的例子假设所有条款都必须是数字。因此,我使用\d+作为条款。

答案 3 :(得分:0)

my $ifindex = ($_=~ /^.*[.]([^.]*)[.][^.]*$/);