Ant Propertyregex文件路径的一部分

时间:2013-11-21 20:28:21

标签: java regex for-loop ant ant-contrib

我使用Ant-Contrib库来循环基目录中的文件列表。我想在基本目录之后获取文件路径的一部分但没有文件名。

例如我的基本目录是:C:\ projects \ Dev \ Main \ Sample Game \ js 我有很多js脚本,在这个文件夹和子文件夹中的名称就像

C:\projects\Dev\Main\Sample Game\js\simple\welcome\ss.js
C:\projects\Dev\Main\Sample Game\js\hard\welcome\cc.js
C:\projects\Dev\Main\Sample Game\js\easy\welcome\ee.js

我想只获得\simple\welcome\。我使用以下代码。

http://pastebin.com/TpqXBb27

<for param="filename">
    <path id="project.fileset">
        <fileset dir="${basedir}/js" includes="/*">
            <include name="**/*.js" />
        </fileset>
    </path>
    <sequential>
        <basename property="file.@{filename}" file="@{filename}"/>
        <propertyregex property="currentdirectory" 
            input="@{filename}"
            regexp="${basedir}/js//([^//]*)//${file.@{filename}}" 
            select="\1"
            casesensitive="false"
            override="true" />
        <echo message="FullPath:@{filename}" />
        <echo message="Directory:${currentdirectory}" />
    </sequential>
</for>

我不知道我应该在那里提供什么正则表达式...我尝试使用正则表达式${basedir}/js//([^//]*)//${file.@{filename}},但得到以下错误

java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 3
C:\projects\Dev\Main\Sample Game\js\simple\welcome\ss.js

请对此正则表达式提出一些建议

2 个答案:

答案 0 :(得分:2)

这听起来更像pathconvert而不是propertyregex

的工作
<for param="filename">
    <path id="project.fileset">
        <fileset dir="${basedir}/js" includes="/*">
            <include name="**/*.js" />
        </fileset>
    </path>
    <sequential>
        <basename property="file.@{filename}" file="@{filename}"/>
        <!-- dirname strips off the trailing file name, leaving the full dir -->
        <dirname property="dir.@{filename}" file="@{filename}"/>
        <pathconvert property="currentdirectory.@{filename}">
            <file file="${dir.@{filename}}" />
            <!-- pathconvert strips off the leading ${basedir}/js -->
            <map from="${basedir}/js" to="" />
        </pathconvert>
        <echo message="FullPath:@{filename}" />
        <echo message="Directory:${currentdirectory.@{filename}}" />
    </sequential>
</for>

答案 1 :(得分:2)

问题是你在PC上,当你使用${basedir}时,它会为你提供带有目录分隔符的后向Windows斜杠的${basedir}<fileset/>正在做同样的事情。

我遇到了同样的情况,我不得不首先在我的路径上做regexreplace,然后进行替换。这是我项目中的代码:

            <var name="dest.name"               unset="true"/>
            <var name="file.lastmodified"       unset="true"/>
            <var name="file.type"               unset="true"/>

            <file.mdate file="@{file}"
            property="file.lastmodified"/>

            <propertyregex property="file"
            input="@{file}"
            regexp="\\"
            replace="/"
            override="true"
            defaultvalue="@{file}"/>

            <propertyregex property="dest.name"
            input="${file}"
            regexp="^${fileset}/"
            replace=""
            override="true"/>

请注意,我现在必须使用<var/>取消设置属性,因此我可以在<for>循环中反复使用它们:

第一个regexreplace会改变

C:\projects\Dev\Main\Sample Game\js\simple\welcome\ss.js

C:/projects/Dev/Main/Sample Game/js/simple/welcome/ss.js

从那里,您可以使用basedir任务删除脚本。然后,您只需要/js/目录。

 <regexreplace property="currentdirectory"
    file="@{file}"
    regex=".*/js/(.*)"
    select="\1"
    override="true"/>