2011-07-06 79 views
2

我正在編寫一個將一個目錄的內容移動到另一個目錄的Ant腳本。除了移動文件之外,我還必須重命名文件。正則表達式重命名

有一些文件的結構爲name1_ab_cd.properties,某些文件的結構爲name2_ab.properties。我基本上必須做的是從第一個_刪除一切,直到最後,並用屬性替換它。

因此,這些文件必須命名爲name1.properties和name2.properties。目前,我的實現如下:

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

這適用於具有兩個_的文件,而不是有一個_的人。 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/ 

替換其中任何一系列字符爲[^ _] *其中除了下劃線的任意字符序列的匹配相匹配的.*。這樣,你只能匹配到第一個下劃線。

事實上,我們可以在分組後排除下劃線:

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

所以,你所要做的就是從改變你的映射:

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

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

^([^_]*)將匹配從行首到第一個下劃線的所有內容。 \.properties$將確保文件名以.properties結尾。我不確定你的第二個分組是做什麼的。 (你是否試圖在.properties後綴後面移動字符串的一部分?)相反,我只是按照您在初始查詢中所述的方式執行了操作。