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

How to rewind next-search start position by 1?

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

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

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

但是,如果我可以将下一个位置的起点倒回 1,我将同时获得偶数和奇数。

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

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

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

一种方法是使用 look-ahead assertion:

while ( $data =~ /#(\d)(?=#)/g ) {
  print , "\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

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

来自perldoc

Returns the offset of where the last m//g search left off for the variable in question ($_ is used when the variable is not specified)

所以,

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