2016-04-08 9 views
0

私はstats gitリポジトリのプログラムを作っていますが、特定の正規表現を動作させるのに問題があります。正規表現を使ってPerlの行を解析する

my $string = "5 2 gitc" 

とこのようになります正規表現を::基本的に、私はこのようになります文字列を持っている私の目標は、追加$として第1の数と第2の数などを格納することです

my ($added, $removed) = $string =~ /([0-9]*) *([0-9]*) *[a-z]*/; 

$が削除されましたが、何らかの理由で$ removedに値が格納されていません。だから私はprint文を使用する場合:

print "-$added $removed-\n"; 

を出力は次のようになります。私は正規表現101上の正規表現は、私のキャプチャグループは、正常に動作するように見えることをテストするとき

-5 - 

ので、私は一種の困惑しますなぜそれがうまくいかないのかについて。私の正規表現に誰かが問題を見ることができますか?カイルはコメントで指摘したように

+1

がタブ文字可能性がありますか?これら2つの行をローカルに実行すると($ stringにスペース文字が確保されます)、それは動作します。すなわち、私は「-5 2」を得る – Marty

+1

数字はオプションか、間違いなくそこにあるはずですか?それらが常に存在する必要がある場合は、 '/'の代わりに '/'を使用してみてください: '/([0-9] +)+([0-9] +)+ [a-z] + /' '+'とマッチする可能性のある方法は少なくなります。 –

+0

@Marty、それは本当に良いアイデアです。私の提案を改訂する:/([0-9] +)[\ t] +([0-9] +)[\ t] + [az] +/' –

答えて

5

- 数字がそこにを持っているならば、可能性の数を減らすために+の代わり*を使用するには、REエンジンが通過検索していると一致します。また、\sは "空白"([\ \t\r\n\f]と定義されたhere)と一致しているため、リテラルスペース文字の代わりにマッチを解除したタブ文字の可能性をカバーできます。

\sを空白に一致させると、リテラルスペース文字が解放され、正規表現自体の書式設定を支援します。これを行うには、仕様の最後に/xを追加して '拡張モード'正規表現を使用します。

最後に、一般的なルールとして、そうした変数に割り当てる前に一致が成功したかどうかをテストします。

my $string = "5 2 gitc"; 
if ($string =~ /(\d+) \s+ (\d+) [a-z]+/x) { 
    my ($added, $removed) = ($1, $2); 
} 
else 
    print "Failed match\n"; 
} 
0

なぜだけではなく、

my ($added, $removed) = split ' ', $string; 
関連する問題