2011-07-06 8 views
2

私は、あるディレクトリの内容を別のディレクトリに移動するAntスクリプトを作成しています。ファイルを移動するだけでなく、ファイルの名前を変更する必要があります。正規表現の名前変更

構造体name1_ab_cd.propertiesを持つファイルがあり、構造体name2_ab.propertiesを持つファイルもあります。私が本質的にしなければならないことは、最初から最後まですべてを削除し、それをプロパティに置き換えることです。

ファイルの名前は、name1.propertiesおよびname2.propertiesのようにする必要があります。現在のところ、私の実装は次のようになります:

<mapper type="regexp" from="(.*)_.*_.*(.*)" to="\1.properties\2" /> 

これは2つの_がありますが1つの_があるファイルでは機能しません。 name1_ab_cd.propertiesの名前はname1.propertiesに変更されますが、name2_ab.propertiesはそのまま残ります。私はそうのようにそれを作る場合:その後、

<mapper type="regexp" from="(.*)_.*(.*)" to="\1.properties\2" /> 

、唯一name2_ab.propertiesはname2.propertiesに改名されるだろう、しかし、name1_ab_cd.propertiesがあるとして残るでしょう。

最初の_を選択してから文字列の最後まで選択する方法が必要です。これをどうやってやりますか?

おかげ

答えて

2

はこれを試してみてください:

<mapper type="regexp" from="([^_.]+)[^.]*(\.properties)" to="\1\2" /> 
+0

素晴らしい!助けてくれてありがとう、非常に感謝します。 – intl

0

正規表現は貪欲です。つまり、可能な限り大きな試合にマッチします。このような文字列を想像:

this_is_a_test 

と私は最初のアンダースコアへの最初の部分をしたい:

this_is_a_test =~ s/^(.*)_/$1/ 

だけthisと一致しません設定括弧が、this_is_a_testその最大の試合だから。これは、すべてをアンダースコアに一致させるように指示しているからです。

基本的なやり方は、私が望まないキャラクターを除外することです。たとえば:

this_is_a_test =~ s/^([^_]*)_/$1/ 

は[^ _] *アンダースコアを除く文字のいずれかのシリーズにマッチした文字のいずれかのシリーズにマッチする.*を置き換えます。そうすれば、最初のアンダースコアにマッチするだけです。実際に

、我々はグループ化した後にアンダースコアを排除することができる:

<mapper type="regexp" from="^([^_]*).*\.properties$" to="\1.properties"/> 

<mapper type="regexp" from="(.*)_.*(.*)" to="\1.properties\2" /> 

this_is_a_test =~ s/^([^_]*)/$1/ 

だから、すべてあなたがしなければならないから、あなたのマッパーを変更で

^([^_]*)は、行の先頭から最初のアンダースコアまでをすべて一致させます。 \.properties$は、ファイル名の末尾が.propertiesであることを確認します。

2番目のグループが何をしているのかわかりません。 (接尾辞.propertiesの後に文字列の一部を移動しようとしていますか?)代わりに、最初のクエリで指定したとおりにしました。