Apache Ant多属性正则匹配问题:SVN输出匹配失败求助
解决Ant中SVN状态正则匹配失败的问题
让我们一步步拆解并解决你的问题:
核心问题分析
你的代码有几个关键问题导致匹配结果不符合预期:
- Ant正则不支持
/gm后缀:Ant基于Java正则引擎,不能在正则末尾加/gm这种Perl风格修饰符,必须用<regexp>的flags属性设置模式。 <matches>组件的行为误解:<matches>是判断整个字符串是否完全匹配正则,而你需要的是检查字符串中是否存在任意匹配的子串,这时候应该用<containsregexp>。- 正则模式与目标需求不匹配:你原本想检查"是否存在不以M开头的条目",但实际写的正则是匹配
^(\*).+,如果当前SVN输出里没有*开头的行,返回false是正常的,但如果你的目标是检测非M开头的状态,正则也需要调整。
针对需求的解决方案
假设你的核心需求是检测SVN状态输出中是否存在不以M开头的条目(比如有更新的*、冲突的C等),以下是修正后的Ant代码:
<exec executable="svn" outputproperty="svnTest"> <arg line="status ${GUI_BASE} -u -q" /> </exec> <!-- 定义正则:匹配任意不以M开头的行,启用多行模式(^/$匹配每行首尾) --> <regexp id="nonMStatus" pattern="^(?!M).+" flags="m" /> <!-- 使用containsregexp检查是否存在匹配的子串 --> <condition property="hasNonMStatus" value="true" else="false"> <containsregexp string="${svnTest}"> <regexp refid="nonMStatus" /> </containsregexp> </condition>
如果你的需求是专门检测是否有需要更新的条目(即*开头的行),可以把正则改成这样:
<regexp id="hasUpdates" pattern="^\*.+" flags="m" /> <condition property="matches" value="true" else="false"> <containsregexp string="${svnTest}"> <regexp refid="hasUpdates" /> </containsregexp> </condition>
额外注意事项
- SVN输出的换行问题:确保
svn status的输出是每行一个文件(默认行为),exec的outputproperty会完整保留换行符,这样多行模式flags="m"才能生效。如果你的输出被合并成一行(比如某些环境下的特殊配置),需要调整正则为(?:^|\s)(?!M)\S+来匹配非M开头的状态字段。 - Java正则语法:Ant的正则遵循Java
Pattern类的语法,如果你需要更复杂的匹配,可以参考Java正则的规则调整模式。
内容的提问来源于stack exchange,提问作者Igino Boffa
相关产品推荐
相关产品推荐

