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

n.r*_*.r. 8 perl regex-lookarounds

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

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

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

但是如果我能够将下一个位置的开始倒数1,我会得到偶数和奇数.

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

我知道我可以用它完成这个任务split.但这不能回答我的问题.

for (split /#/, $data) {
  print $_, "\n";
}
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 12

一种方法是使用前瞻性断言:

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

前瞻断言中的字符不是匹配表达式的一部分,并且不会更新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
Run Code Online (Sandbox Code Playgroud)

  • 虽然这没有回答所提出的问题,但它是OP正在尝试做的更好的解决方案. (5认同)
  • @Alec Teal,对于只懂英语的人来说,中国人似乎是胡言乱语,但事实并非如此,而且说这是不礼貌的.也许你应该寻求教育,而不是自豪地宣布你的无知?`/.../`匹配`= ~`运算符绑定的变量内的正则表达式模式(在这种情况下为`$ data`).在标量上下文中(如此处所示),如果匹配则返回true.在标量上下文中,`g`选项使匹配结束的位置保存为下一次尝试的起始位置. (2认同)

Сух*_*й27 8

你打电话pos()$_,而不是$data

perldoc

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

所以,

pos($data) = pos($data) - 1;
Run Code Online (Sandbox Code Playgroud)