如何将下一个搜索开始位置倒数1?

时间:2015-07-21 15:21:07

标签: perl regex-lookarounds

如何将下一个搜索位置的开头倒数1?例如,假设我想匹配#之间的所有数字。以下将只给出奇数数字。

my $data="#1#2#3#4#";

while ( $data =~ /#(\d)#/g ) {
  print $1, "\n";
}

但如果我可以将下一个位置的开头倒数1,我会得到偶数和奇数。

这不起作用:pos() = pos() - 1;

我知道我可以使用split来完成此任务。但这并没有回答我的问题。

for (split /#/, $data) {
  print $_, "\n";
}

2 个答案:

答案 0 :(得分:11)

一种方法是使用look-ahead assertion

while ( $data =~ /#(\d)(?=#)/g ) {
  print $1, "\n";
}

前瞻断言中的字符不是匹配表达式的一部分,也不会更新pos()超过正则表达式的\d部分。

更多演示:

say "#1#2#3#4#" =~ /#(\d)/g;          #  1234
say "#1#2#3#4"  =~ /#(\d)/g;          #  1234
say "#1#2#3#4#" =~ /#(\d)(?=#)/g;     #  1234
say "#1#2#3#4"  =~ /#(\d)(?=#)/g;     #  123

答案 1 :(得分:8)

您在pos()上呼叫$_,而不是$data

来自perldoc

  

返回最后一个m // g搜索为相关变量留下的偏移量(当未指定变量时使用$ _)

所以,

pos($data) = pos($data) - 1;