我正在编写一个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将保持不变。
我需要一种方法来选择第一个_然后选择直到字符串的结尾。我该怎么做呢?
由于
答案 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
后缀之后移动部分字符串?)相反,我只是按照您在初始查询中所述的方式执行此操作。