我想通过\
在它们之前添加一个来转义Java属性文件中包含空格的所有键
示例输入
prop with spaces=value with spaces
#comment should not be replaced
prop_without_spaces=value with spaces 2
期望的输出:
prop\ with\ spaces=value with spaces
#comment should not be replaced
prop_without_spaces=value with spaces 2
我知道我可以用
<replaceregexp byline="true" flags="g" match="\s" replace="\\\\ " file="..."/>
但它呈现了这个结果
prop\ with\ spaces=value\ with\ spaces
#comment\ should\ not\ be\ replaced
prop_without_spaces=value\ with\ spaces\ 2
或者我可以做这样的事情^(([^=])|(\s))*(=.*)
来匹配各个组,但是我如何替换所有空格,例如我如何重建结果以仅包含非空格?
换句话说,给定上述输入,我如何在正则表达式中执行以下伪代码:
- 对于不以 a 开头的行
#
=
对于第一个符号之前的所有字符- 用“\”(正斜杠、空格)替换所有“”(空格)
这在 RegEx 中是否可能,特别是在 Java RegEx 中?(最好是ANTreplaceregexp
示例)
编辑:解决方案需要是一个正则表达式,不能涉及任何代码(不幸的是)。我知道如何使用代码解决这个问题:)(尽管感谢您的建议),但我正在尝试首先使用 RegEx 解决方案(因为我使用的是 ANT,所以它需要编写一个我尽量避免的自定义任务)。
EDIT2基于出色的答案,以下是可用的 ANT 版本:
使用 \G
<replaceregexp match="(\\G[^#= ]*) " replace="\1\\\\ " byline="true"... />
使用前瞻
转义已=
登录的评论
<replaceregexp match="(\s)(?=.*=)" replace="\\\\ " ... />
使用前瞻 + 后瞻
根本没有转义注释行(我认为矫枉过正)
<replaceregexp match="(?<!#[^=]{0,100})(\s)(?=.*=)" replace="\\\\ " ... />