作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如 perlpacktut 中所述,您可以使用 X/Y* 的解压缩字符串首先获取字节流的长度,然后准确读取那么多字节。但是,我正在努力在正则表达式中找到类似的东西,比如纯 ASCII 数字和字符串。例如,Bencoded 字符串的形式为:
[length]:[bytes]
4:spam
4:spam10:green eggs
我记得曾经能够实现这一点,但只能使用 ??{},而且我现在手边没有代码。这可以在没有 ??{}(这是 super 实验性)的情况下使用较新的 5.10 捕获/反向引用之一完成吗?
明显的表达方式不起作用:
/(\d+)\:(.{\1})/g
/(\d+)\:(.{\g-1})/g
最佳答案
使用带有 /g
标志和 \G
anchor 的正则表达式,但在标量上下文中。这会在最后一个模式匹配(或第一个模式的开头)之后保持字符串中的位置。你可以这样沿着绳子走。获取长度,跳过冒号,然后使用 substr 获取正确数量的字符。您实际上可以分配给 pos
,因此请为您刚刚提取的字符更新它。 重做
直到你没有更多的匹配:
use v5.10.1;
LINE: while( my $line = <DATA> ) {
chomp( $line );
{
say $line;
next LINE unless $line =~ m/\G(\d+):/g; # scalar /g!
say "\t1. pos is ", pos($line);
my( $length, $string ) = ( $1, substr $line, pos($line), $1 );
pos($line) += $length;
say "\t2. pos is ", pos($line);
print "\tFound length $length with [$string]\n";
redo;
}
}
__END__
4:spam6:Roscoe
6:Buster10:green eggs
4:abcd5:123:44:Mimi
注意最后一行中的边缘情况。 3:
是字符串的一部分,不是新记录。我的输出是:
4:spam6:Roscoe
1. pos is 2
2. pos is 6
Found length 4 with [spam]
4:spam6:Roscoe
1. pos is 8
2. pos is 14
Found length 6 with [Roscoe]
4:spam6:Roscoe
6:Buster10:green eggs
1. pos is 2
2. pos is 8
Found length 6 with [Buster]
6:Buster10:green eggs
1. pos is 11
2. pos is 21
Found length 10 with [green eggs]
6:Buster10:green eggs
4:abcd5:123:44:Mimi
1. pos is 2
2. pos is 6
Found length 4 with [abcd]
4:abcd5:123:44:Mimi
1. pos is 8
2. pos is 13
Found length 5 with [123:4]
4:abcd5:123:44:Mimi
1. pos is 15
2. pos is 19
Found length 4 with [Mimi]
4:abcd5:123:44:Mimi
我认为可能有一个模块用于此,并且有:Bencode .它做了我所做的。这意味着我白做了很多工作。始终首先查看 CPAN。即使你不使用该模块,你也可以看看他们的解决方案:)
关于regex - Perl 的 unpack ("A4/A*") 正则表达式形式的长度+字节语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730797/
我是一名优秀的程序员,十分优秀!