何が問題なのですか?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
何が問題なのですか?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
あるので、最初の文字は "s"ではなく$ 1(したがって$ 1 =共通)になり、 ".jar"で終わるものは$ 2になります(したがって$ 2 = "-logging.jar")。
2番目の形式では、「少なくとも1つ以上の文字が「s」ではないものをすべてキャプチャしていますキャプチャは "c"で始まります)、 ".jar"で終わるものが続きます(したがって$ 1の "commons-logging.jar"全体を取得します)
[^s]+
マッチリテラル「S」ではないすべての文字として 、あなたが得る最高の最初のものは「まで非貪欲にすべてをキャプチャすると言い-logging.jar
おっとは、\逃したおかげ –
正規表現は1つあります。 "任意の数の任意の文字(欲張りではない)、続いて、少なくとも1文字の後に.jar"が続きます。
「それに続く」は重要です。一致するものは重複できません。
試してみてください。
echo commons-logging.jar | perl -pe 's/(.*?)([^s]+\.jar)/$1 $1$2/'
おかげで、sの前に\私は逃した表示されます –