如何将下一个搜索开始位置倒回 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;
如何将下一个搜索位置的开始位置后退 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;