読者です 読者をやめる 読者になる 読者になる

アルファベットと数字を分解

以前の日記で、文字列をアルファベットと数字に分割するのに先読み、後読みアサーションなんて使ってました。

@a = split /(?<=[a-z])(?=\d)|(?<=\d)(?=[a-z])/, "12ab3cde45";

print "$_\n" for @a;

出力

12
ab
3
cde
45


でもsplitの正規表現を()で括ればそこも要素として取り込んでくれます。
というわけでこれでもいいです。

@a = split /(\d+)/, "12ab3cde45";
shift @a if $a[0] eq '';

print "$_\n" for @a;

shiftしてるのは文字列の最初が数字だったら空文字列が入っちゃうからです。
'', '12', 'ab', '3', 'cde', '45'
どうして末尾にも空文字列が入ってこうならないのかはよくわかりませんが・・・
'', '12', 'ab', '3', 'cde', '45', ''