3

我想通过\在它们之前添加一个来转义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="(?&lt;!#[^=]{0,100})(\s)(?=.*=)" replace="\\\\ " ... />
4

4 回答 4

2

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

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

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

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

当然,一定要使用m修饰符来^匹配每一行的开头。

工作演示。

于 2013-08-20T19:00:40.570 回答
1

不一定是最有效的,但您可以使用以下match表达式

\s(?=.*=)

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

于 2013-08-20T19:20:50.480 回答
0

我不知道用正则表达式来做,但如果你阅读每一行你可以做string.replaceAll(" ", "\\ "),并避免注释行:

if(!string.startsWith("#"))
{
    string = string.replaceAll(" ", "\\ ");
}
于 2013-08-20T18:58:46.017 回答
0

您可以执行以下操作:

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

否则,您可以使用拆分在一行中完成。

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

希望有帮助!!

于 2013-08-20T19:04:14.430 回答