替换属性文件的键中的所有空格

时间:2013-08-20 18:56:20

标签: java regex ant

我想通过在它们之前添加\来转义包含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))*(=.*)的操作来匹配各个组,但是如何替换所有空格,例如如何重建结果以仅包含非空格?

换句话说,如上所述输入,如何在正则表达式中执行以下伪代码:

  • 表示不以#
  • 开头的行
  • 表示第一个=符号之前的所有字符
  • 全部替换&#34; &#34; (空格)用&#34; \&#34; (正斜线,空格)

这在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="(?&lt;!#[^=]{0,100})(\s)(?=.*=)" replace="\\\\ " ... />

4 个答案:

答案 0 :(得分:2)

我不是关于ant,但是如果它只是通过一个简单的replaceAll运行,那么你可以使用\G锚点来确保匹配是相邻的:

"((?:^|\\G)[^#= ]*) "

并将其替换为"$1\\ "。最初我们可以忽略\\G替代方案。所以我们只是尝试找到一行的开头,然后只要当前字符既不是空格,也不是开始注释,也不是值([^#= ]*),我们就会继续。然后我们匹配一个空间。空间前面的所有东西都被捕获到组1中,我们用$1写回来,然后是反斜杠,然后是空格。

现在,当匹配器再次尝试匹配时,除了字符串的开头之外,它还可以在它停止的地方继续 - 这仍然是感兴趣的位置 - 在注释或值之前的任何行中。

当然,请务必使用m修饰符使^与每行的开头匹配。

Working demo.

答案 1 :(得分:1)

不一定效率最高,但您可以使用{/ 1}}

的表达式
match

哪个至少会限制它只匹配每行上最后一个等号左边的空格(它不会完全跳过注释行,但它只会转义包含等号的注释中的空格)。这取决于任何是否包含等号,这可能也可能不够。

答案 2 :(得分:0)

我不知道用正则表达式做这件事,但是如果你读了每行,你可以做string.replaceAll(" ", "\\ "),并避免使用注释行:

if(!string.startsWith("#"))
{
    string = string.replaceAll(" ", "\\ ");
}

答案 3 :(得分:0)

您可以执行以下操作:

  1. 使用FileReader读取文件的每一行。
  2. 对于每一行,使用子字符串
  3. 将其=拆分为两部分
  4. 对于split的第一部分应用正则表达式
  5. 将第一个公园与第二部分连接起来。
  6. 否则你可以使用拆分在一行中完成。

    String s = "my name = abc is my name"
    System.out.println(s.split("=")[0].replaceAll("\\s", "") + " = " + s.split("=")[1]);
    

    希望它有所帮助!!