使用Ant的正则表达式系统似乎给我带来了麻烦。有足够的工作,我通常可以让它工作(并了解我之前做错了什么)。但不是这次。我有一个简单的目标,其中我想从包含一个或多个逗号分隔的单词的属性中提取第一个元素,如下所示:
tgt.list.full=word1,word2,word3,word4
(编辑:tgt.list.full实际上是由另一个属性填充的:tgt.list.basic,所以实际的cfg.list.file看起来像这样:
tgt.list.basic=word1,word2,word3,word4
tgt.list.full=${tgt.list.basic}
)
我想要第一个单词:“word1”来替换$ {target}属性。这就是我的任务:
<target name="load-configuration-list">
<loadproperties srcfile="${cfg.list.file}">
<filterchain>
<containsregex pattern="^tgt.list.full=(.*),?.*" replace="target=\1" />
<concatfilter prepend="${cfg.list.file}" />
</filterchain>
</loadproperties>
<echo message="TGT: ${target}, FULL: ${tgt.list.full}"/>
<fail unless="target" message="A target cannot be determined"/>
</target>
使用我在“containsregex”任务下列出的当前版本,$ {target}将填充完整列表(“word1,word2,word3,word4”)而不仅仅是“word1”。我尝试了很多变种。这是一个例子:
<containsregex pattern="^tgt.list.full=(word1),?.*" replace="target=\1" />
我希望这至少会强制要填充目标属性,但在这种情况下,$ {target}仍未定义(甚至不会将完整列表放入其中)。
也许我的过滤链逻辑存在缺陷。我知道我可以编写自己的任务,但是如果我能更好地理解它们,Ant 似乎就已经拥有了我需要的组件。
重新解释我的原始问题:给定Ant属性中的逗号分隔列表,我如何使用Ant任务(不一定使用containsregex或replaceregex)来提取第一个元素?
答案 0 :(得分:2)
这个正则表达式是否更适合您的需求?
^tgt.list.full=([^,]+),?.*
^tgt.list.full=([^,]+),?[^\r\n]*$
由于“.
”(点)表示任何字符,“(.*),?.*
”会选择word1,word2,...因为*
量词的greediness 。
可能“(.*?),?.*
”会更好,但至少在[^,]+
,我们知道贪婪的运算符不会捕获任何“,
”。
可能需要第二种形式以确保仅捕获一条行上的内容,而不是“,
之后的所有内容”(包括下一行,因为'。 '在'dotall'模式下,可以包含crlf字符。)
正如Adam在评论中提到的那样:
“
target
”道具实际上由“${tgt.list.basic},
”而不是“full
”填充。
因此,在一切都解决后,目标现在由基本列表填充 我将完整列表移出cfg文件,以便稍后(而不是立即)填充基本列表