次のような行を含むファイルがあるとします。
"7sunrIsEfoo"
"10ecological09"
"3bedtime"
各行は、番号 n を表す数字で始まります。それに続くn文字を一致させたい。出力は次のようになります。
sunrIsE
ecological
bed
正規表現を使用してこれを行う方法はありますか? 私の最初の試みは:
([0-9]*)[a-zA-Z]{\1}
しかし、うまくいかないようです。
それは正規表現では不可能です。
([0-9]*)
数字を部分文字列として「記憶」するだけです。数値として使用することはできません。
Ruby では、以下を使用できます。
result = string[/(\d+)([a-zA-Z]+)/,2][0,$1.to_i]
期待どおりの結果が得られます。
正規表現はこのタスクにはあまり適していません。彼らは数を解釈する方法を構築していません。を使用して(厄介な)回避策を使用できます
(?<=1).|(?<=2)..|(?<=3)...|
など(逆の順序を使用する方がよいですが、そうしないと、11に到達したときに問題が発生します)。本当に他に方法がない場合を除いて、この方法を使用しないでください=)
これを Perl で行う方法を次に示します。
#!/usr/local/bin/perl
use strict;
use warnings;
my @list = ("7sunrIsEfoo", "10ecological09", "3bedtime");
foreach(@list) {
s/^(\d+)(.+)$/substr($2, 0, $1)/e;
print $_,"\n";
}
出力:
sunrIsE
ecological
bed