我有一个二进制数,例如 10000111000011
,并希望将其分成连续的 1 和 0 组,1 0000 111 0000 11
。
我认为这是使用环视的绝佳机会:我的正则表达式对数字使用正向后查找(它捕获该数字以供以后反向引用),然后对同一数字使用负向前查找(使用反向引用) ,所以只要一个数字后面跟着一个不同的数字,我就应该进行分割。
use strict;
use warnings;
use feature 'say';
my $bin_string = '10000111000011';
my @groups = split /(?<=(\d))(?!\g1)/, $bin_string;
say "@groups";
但是,这会导致
1 1 0000 0 111 1 0000 0 11 1
不知何故,捕获的数字会在每次分割时插入。出了什么问题?
最佳答案
这是对您的代码的一个小修复:
my @groups = split /(?<=0(?!0)|1(?!1))/, $bin_string;
您遇到的问题是,当使用split
时,捕获的文本也会输出到结果数组中。因此,解决方案是摆脱捕获组。
由于您的输入中只有 0
或 1
,因此通过交替和前瞻来确保数字发生变化非常容易。
参见demo
关于regex - 将二进制数分成零组和一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31781987/