Как разделить букву и цифру между строками в perl? - PullRequest
2 голосов
/ 30 марта 2019

Разделите строку, используя split (), и сделайте массив из этой строки таким, чтобы слова и числа были разделены.

Я знаю, что lookahead и lookbehind нужно использовать для расщепления нулевой ширины, поэтому я использовал это.

$string = 'A1BB22CCC333DDDD';
@string = split(/(?=\d+)|(?<=\d+)/,$string);
print "@string";

Ожидание:

A 1 BB 22 CCC 333 DDDD

Но результаты:

Внешний вид переменной длины не реализован в регулярном выражении m / (? = \ D +) | (? <= \ D +) / в строке 2.jdoodle.pl 2. </p>

Команда вышла с ненулевым статусом 255.

Ответы [ 2 ]

5 голосов
/ 30 марта 2019

Вы можете использовать шаблон как /(\d+)/, чтобы разбить строку.

Шаблон содержит группу захвата; как объяснено в perldoc split :

Если PATTERN содержит группы захвата, то для каждого разделителя создается дополнительное поле для каждой подстроки, захваченной группой (в порядке, в котором группы указаны, согласно обратным ссылкам);

Рассмотрим:

use strict;
use warnings;
my $string = "A1BB22CCC333DDDD";
my @result = split /(\d+)/, $string;
print "$_\n" for @result;

Урожайность:

A
1
BB
22
CCC
333
DDDD

Приведенное выше решение вернет начальный пустой элемент, если строка действительно начинается с цифры. Чтобы избежать этого, вы можете изменить выражение следующим образом:

my @result = grep length, split /(\d+)/, $string;
2 голосов
/ 31 марта 2019

Вариант 1:

Нет необходимости проверять, сколько цифр на каждой стороне точки разделения, поэтому вы можете просто заменить \d+ на \d, чтобы избежать ошибки, которую вы получаете. Но тогда вы заметите вторую проблему с вашим решением: вы не просто разделяете между цифрами и не цифрами; Вы также разделяете две цифры. Исправлено:

my @parts = split /(?<=\D)(?=\d)|(?<=\d)(?=\D)/, $string;

Вариант 2:

Текст, захваченный шаблоном, переданным split, возвращается, что дает нам альтернативное решение с использованием split.

my @parts = grep length, split /(\d+)/, $string;

grep обрабатывает случай, когда $string начинается с цифры.

Вы попадаете в ситуацию, когда вам нужно исправить вывод split, например, когда то, на что вы разбиваете, на самом деле не является разделителем. Это должно сказать вам, что split не подходит в такой ситуации.

Вариант 3:

Здесь будет простой матч с регулярным выражением.

my @parts = $string =~ /\d+|\D+/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...