2017-01-27 19 views
0

ファイル名から特定の値を抽出するためにPerl正規表現を使用したいと思います。 (私は最後の_後に、(常に3であることが保証)最初の3桁の数字、文字列の最後の部分を抽出したい以上のことからPerl正規表現から特定の値を抽出する

testImrrFoo_Bar001_off 
testImrrFooBar_bar000_m030 
testImrrFooBar_bar231_p030 

: 彼らは、次の(有効な)名前を持っていますoff、または(mまたはp)のいずれかで、3桁の数字が続きます)。最初に抽出するのは3桁、2番目の文字列です。

そして、私は次のメソッド(私はこれが1最適な/素敵ではないかもしれません実現)で出てきた:

のみ $1は、私が欲しい有効な結果(情報のつまり最後のビットを持っている
my $marker = '^testImrr[a-zA-z_]+\d{3}_(off|(m|p)\d{3})$'; 
if ($str =~ m/$marker/) 
{ 
    print "1=$1 2=$2"; 
} 

)、$2が空になります。どのようにそれらの3桁を中央に取得する上の任意のアイデア?

答えて

5

あなたはほとんどそこにいました。ただ、


- 周りの括弧追加することにより、3桁の数字をキャプチャ: - ((?:m|p))その前に括弧の後?:を追加することにより、m|pをキャプチャしていない、またはその代わりに[mp]を使用して(\d{3})
を:

^testImrr[a-zA-z_]+(\d{3})_(off|[mp]\d{3})$ 

そして、あなたが買ってあげる:

1=001 2=off 
1=000 2=m030 
1=231 2=p030 
+1

ダーン!とても近い。私は誓う、X年の実践の後、私はこれらの皮肉な正規表現を理解するだろう...! –

+0

@ titus.andronicusでは、あなたは正規表現をテストするためにhttps://regex101.com/に行くことができます。また、キャプチャしたグループの中身を提供します。正規表現のデバッグに役立ちます。 –

2

あなたはBOをキャプチャすることができます目は一度、例えば

if ($str =~ /(\d{3})_(off|(?:m|p)\d{3})$/) { 
    print "1=$1, 2=$2".$/; 
} 

次の例と同様に(off|(m|p)\d{3}m|p)2つのキャプチャグループを持っています。最初のファイル名の場合、2番目のキャプチャグループでは、他のブランチに一致するために何もキャッチされません。キャプチャしていないグループの場合は(?:yourgroup)を使用してください。

1

シンプルsplitsubstrで十分で正規表現のために本当に必要はありません:

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    my @fields = split(/_/); 
    my $digits = substr($fields[1], -3); 

    print "1=$digits 2=$fields[2]\n"; 
} 

__DATA__ 
testImrrFoo_Bar001_off 
testImrrFooBar_bar000_m030 
testImrrFooBar_bar231_p030 

出力:

1=001 2=off 
1=000 2=m030 
1=231 2=p030 
関連する問題