2012-05-11 13 views
3

を変更された文字列を返す、私はこのような文字列があります。のPerl - 文字列の最後の数字の後に戻り、最後の英字とあまりに

$var = '123456d'; 

または多分

$var = '123456'; # (no alpha char) 

を最大6桁の数字がありますそれが重要なら5以上でなければなりません。 アルファ、スペース、または特殊な数字は混在しません。

私のPerlスクリプトでは、最後のアルファ文字とアルファベットのない文字列を削除して返す必要があります。

\ Dとトリムを使うことができますか?またはチョップ?しかし、両方のvarsをすばやく取得する簡単な方法が必要です。その後、

my $numbers =~ s/\D+?$var//; #??? 

my $alpha = substr($var, 0, -1); ## but no alpha check. 

または

my $alpha = chop($var); ## but no alpha check. 

ように-Zとあれば、それは英字であるかどうかを確認します。

それとも私の能力の解決策の限界:

$alpha = $var; 
$alpha =~ s/[0-9]//ig; 
$var =~ s/[a-Z]//ig; 
$numbers = $var; 

その結果:

($numbers == '123456') 
($alpha eq 'd') (or '' if nothing) 

私はちょうど該当する解決策を見つけるか書くことができない、これはここに頼むには余りにも簡単ですように感じるが、 。

私の=〜sの使用は単なる推測ですが、より良い方法や1つのライナーが必要です。ここにすべての助けを

おかげで...考えた後

SORRY!数字の後にアルファベット2文字が表示されることがあります。

$var =~ s{^([0-9]+).*}{$1}i; 
+0

'[A-z] 'の範囲は重大なエラーです。アルファ文字の場合は、 '\ p {alpha}'と書いてください。 – tchrist

+0

ありがとうございます。$ var =〜s/\ p {alpha} // ig; ?? –

答えて

6

\pLを使用すると、数字をキャプチャしないようにすることができます。文字列をオプションにすると、数字のない数字でも一致することが保証されます。

my $var = '123456d'; 
my ($num, $letter) = $var =~ /^(\d+)(\pL)?$/; 

、それはまた、数字が含まれているため、あなたは、可能なエンディングの手紙をキャプチャする\wを使用することはできません。 tchristが指摘したように、\p{alpha}も使用できます。

+0

私は実際に理解すると思います!私はこれを試して、あなたに戻ってきます。 –

+0

'(\ d +)'は最後に番号が捕捉されないように欲張りませんか?あるいは、 "12345d3"のような入力を考えていますか? –

+0

@RobI最後に手紙だったと思った。それが実際に数字になることができれば、他の方法も必要です。 – TLP

0

たぶん、このような何か:

my $numbers =~ s/(\d+)(\p{alpha}+)?/$1/; 

my $alpha = $2; 

$1彼らは私があまりにもTO0これを見つけた単一VAR($アルファ当量D-D '')と一緒に返される

が必要になります最初のかっこのキャプチャを参照し、$2は2番目のキャプチャを参照します。

編集:数字の場合は\d、アルファの場合は\p{alpha}です。

+2

私はそれが不正確であることを恐れています。「\ w」は***ではありません***アルファプラスアンダースコアです。すべてのアルファベット(丸で囲まれた文字とローマ数字などの文字番号を含む)、すべての結合記号、すべての数字、およびすべてのコネクタの句読点です。とにかく、あなたがアルファをしたいなら、 '\ p {alpha}'と書いてください。 – tchrist

+0

@tchrist前に '\ pL'をお勧めします。 – TLP

+0

@TLP完全な技術的定義では '\ pL'と' \ p {alpha} 'との間に違いがありますが(後者は前者を含みますが、他にもたくさんあります)、 '\ pL'は多くの人には馴染みのないものですぎりぎりとした魅力はほとんどが探しています。 – tchrist

関連する問題