2011-07-06 75 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后缀后面移动字符串的一部分?)相反,我只是按照您在初始查询中所述的方式执行了操作。