我使用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\
。我使用以下代码。
<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
请对此正则表达式提出一些建议
答案 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"/>