У меня есть двоичное число, например 10000111000011
, и вы хотите разбить его на группы последовательных 1s и 0s, 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
так или иначе, захваченная цифра вставлена в каждом расколе. Что пошло не так?
Вам не нужен 'split'. Попробуйте '@ groups = $ bin_string = ~/1 + | 0 +/g' .. –
Это, конечно, более элегантно! Я все еще хотел понять, что происходит, и, возможно, есть способ спасти регулярное выражение. –
У вас есть свой ответ, но я просто добавлю, что, прочитав это, моя первая мысль была «слишком сложная». 'perl -pe 's/(0+ | 1 +)/\ 1/g' <<<" 10000111000011 "выполняет задание или если вы хотите что-то более обобщенное,' perl -pe 's/((.) \ 2 *)/\ 1/g''. – ghoti