2011-07-15 9 views
-1

何が問題なのですか?perlの正規表現の予期しない結果

echo commons-logging.jar | perl -pe 's/(.*?)([^s]+\.jar)/$1 $2/' 
commons -logging.jar 

私はcommons-logging.jar全体をキャプチャすると思いますか?特に

echo commons-logging.jar | perl -pe 's/([^s]+\.jar)/$1/' 
commons-logging.jar 

答えて

1

あるので、最初の文字は "s"ではなく$ 1(したがって$ 1 =共通)になり、 ".jar"で終わるものは$ 2になります(したがって$ 2 = "-logging.jar")。

2番目の形式では、「少なくとも1つ以上の文字が「s」ではないものをすべてキャプチャしていますキャプチャは "c"で始まります)、 ".jar"で終わるものが続きます(したがって$ 1の "commons-logging.jar"全体を取得します)

+0

おかげで、sの前に\私は逃した表示されます –

1

[^s]+マッチリテラル「S」ではないすべての文字として 、あなたが得る最高の最初のものは「まで非貪欲にすべてをキャプチャすると言い-logging.jar

+0

おっとは、\逃したおかげ –

0

正規表現は1つあります。 "任意の数の任意の文字(欲張りではない)、続いて、少なくとも1文字の後に.jar"が続きます。

「それに続く」は重要です。一致するものは重複できません。

試してみてください。

echo commons-logging.jar | perl -pe 's/(.*?)([^s]+\.jar)/$1 $1$2/' 
関連する問題