正则表达式重命名

时间:2011-07-06 16:23:02

标签: regex ant

我正在编写一个Ant脚本,将一个目录的内容移动到另一个目录。除了移动文件之外,我还必须重命名文件。

有些文件的结构名称为_1ab_cd.properties,而某些文件的结构名称为_2ab.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 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分: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后缀之后移动部分字符串?)相反,我只是按照您在初始查询中所述的方式执行此操作。