我想通过在它们之前添加\
来转义包含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))*(=.*)
的操作来匹配各个组,但是如何替换所有空格,例如如何重建结果以仅包含非空格?
换句话说,如上所述输入,如何在正则表达式中执行以下伪代码:
#
=
符号之前的所有字符这在RegEx中是否可能,特别是在Java RegEx中? (最好是ANT replaceregexp
例子)
编辑:解决方案需要是一个RegEx表达式,不可能涉及任何代码(不幸的是)。我知道如何使用代码解决这个问题:)(感谢您的建议),但我首先尝试使用RegEx解决方案(因为我使用ANT,它需要编写自定义任务,我试图避免)。
EDIT2 根据好的答案,以下是正在使用的ANT版本:
使用\ G
<replaceregexp match="(\\G[^#= ]*) " replace="\1\\\\ " byline="true"... />
使用前瞻
转发=
签到
<replaceregexp match="(\s)(?=.*=)" replace="\\\\ " ... />
使用lookahead + lookbehind
根本没有逃避评论行(我认为有点过分)
<replaceregexp match="(?<!#[^=]{0,100})(\s)(?=.*=)" replace="\\\\ " ... />
答案 0 :(得分:2)
我不是关于ant,但是如果它只是通过一个简单的replaceAll
运行,那么你可以使用\G
锚点来确保匹配是相邻的:
"((?:^|\\G)[^#= ]*) "
并将其替换为"$1\\ "
。最初我们可以忽略\\G
替代方案。所以我们只是尝试找到一行的开头,然后只要当前字符既不是空格,也不是开始注释,也不是值([^#= ]*
),我们就会继续。然后我们匹配一个空间。空间前面的所有东西都被捕获到组1中,我们用$1
写回来,然后是反斜杠,然后是空格。
现在,当匹配器再次尝试匹配时,除了字符串的开头之外,它还可以在它停止的地方继续 - 这仍然是感兴趣的位置 - 在注释或值之前的任何行中。
当然,请务必使用m
修饰符使^
与每行的开头匹配。
答案 1 :(得分:1)
不一定效率最高,但您可以使用{/ 1}}
的表达式match
哪个至少会限制它只匹配每行上最后一个等号左边的空格(它不会完全跳过注释行,但它只会转义包含等号的注释中的空格)。这取决于任何值是否包含等号,这可能也可能不够。
答案 2 :(得分:0)
我不知道用正则表达式做这件事,但是如果你读了每行,你可以做string.replaceAll(" ", "\\ ")
,并避免使用注释行:
if(!string.startsWith("#"))
{
string = string.replaceAll(" ", "\\ ");
}
答案 3 :(得分:0)
您可以执行以下操作:
=
拆分为两部分
否则你可以使用拆分在一行中完成。
String s = "my name = abc is my name"
System.out.println(s.split("=")[0].replaceAll("\\s", "") + " = " + s.split("=")[1]);
希望它有所帮助!!