2013-08-20 53 views
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 

我知道我可以取代所有sp与

<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))*(=.*)相匹配的各种团体,但后来如何更换所有空格,如我如何重建结果以仅包含非空格?

换句话说,考虑到上述的输入,我该怎么办下面的伪代码,在正则表达式:

  • 对于不具有#
  • 对于之前的所有字符开始行第一=迹象
  • “用(空格)” \全部替换“”(正斜杠,空间)

这有可能在正则表达式一般,而且在Java中的正则表达式特别? (最好是ANT replaceregexp示例)

编辑:解决方案需要是RegEx表达式,不会涉及任何代码(不幸的是)。我知道如何使用代码解决这个问题:)(谢谢你的建议),但我试图去争取RegEx解决方案(因为我使用ANT,它需要编写一个自定义任务,我试图避免)。

EDIT2基于伟大的答案,这里的工作ANT版本:

使用\ G变

<replaceregexp match="(\\G[^#= ]*) " replace="\1\\\\ " byline="true"... /> 

使用先行有=标志

逃离评论在他们身上

<replaceregexp match="(\s)(?=.*=)" replace="\\\\ " ... /> 

使用前瞻+回顾后

不逃避所有注释行(矫枉过正我认为)

<replaceregexp match="(?&lt;!#[^=]{0,100})(\s)(?=.*=)" replace="\\\\ " ... /> 

回答

1

不一定是最有效的,但你可以使用一个match表达

\s(?=.*=) 

这将至少它限制在每行只匹配空格最后等号的左边(它不会完全跳过评论行,但它只会在注释中包含等号的空格)。这取决于中是否包含等号,这可能也可能不够。

+0

它很棒。我可以接受逃脱的评论,他们有=签名,这是一个非常可读的选项。 –

0

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

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

谢谢,但正如我在这个问题中所说的,它也将取代它所需的值来替换关键部分中的所有空格...... –

+0

请参阅我的编辑。简单的跳过以'#'开头的行的问题 – StormeHawke

+0

谢谢,仍然会替换值部分(在=后面)。但感谢您的建议! –

2

我做的不是蚂蚁,但如果我牛逼只是通过简单的replaceAll运行,那么你可以利用\G锚,从而确保匹配是相邻的:

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

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

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

当然,请确保使用m修饰符使^匹配每行的开头。

Working demo.

+0

嗯......有趣的,试试吧! –

+0

哦,是的,它的工作原理!只是试图围绕我的头*如何*它的工作:)但让我做一些功课之前,我要求澄清,谢谢! + 1000 –

+2

因为'\ G'还匹配行首?是不是'^ |'实际上是多余的? – Jerry

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]); 

希望它有帮助!

+0

谢谢!欣赏它,但我对纯正则表达式解决方案感兴趣:) –

+1

纯粹的正则表达式解决方案在这种情况下只会使代码更加晦涩难以维护。 – StormeHawke

+1

@StormeHawke你可能是正确的,但让我首先看看*是否是一个纯正则表达式解决方案...因为我使用ANT,这意味着编写一个自定义任务,我试图避免。 –