使用RegEx替换属性值

时间:2009-06-16 20:12:26

标签: java regex properties

我有config.properties文件,其中包含Java Properties格式的属性。 我需要使用新值替换具有已知名称的属性的值。应保留文件的注释和格式。

我目前的做法是使用RegEx匹配属性名称,然后替换它的值。但是,Java Properties支持多行值,我很难匹配。

这是一个例子。假设config.properties包含以下文本:

# A property
A = 1\
     2

# B property
B = 2

我想用“3”替换属性A的值。最终结果应该是:

# A property
A = 3

# B property
B = 2

我当前的RegEx (?s)(A[\\s]*=[\\s]*)(.*)无效。

请建议使用RegEx或其他方式。

谢谢!

3 个答案:

答案 0 :(得分:2)

试试这个:

String regex = "(?m)^(A\\s*+=\\s*+)"
    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";

我写完第一部分,所以我可以集中精力匹配价值;管理密钥和分隔符的规则实际上要复杂得多。

该值由除回车符,换行符或反斜杠之外的任何字符的零个或多个组成,或者后跟行分隔符或任何单个非行分隔符的反斜杠组成。行分隔符可以是三种最常见的形式中的任何一种:DOS / Windows(\r\n),Unix / Linux / OSX(\n)或OSX前Mac(\r)。< / p>

请注意,正则表达式处于多线模式,因此线锚将起作用,但单线(DOTALL)模式。我也一直使用占有量词,因为我知道回溯永远不会有用。

答案 1 :(得分:1)

您可以使用Java工具加载,读取,修改和保存属性文件。

我个人喜欢Jakarta Commons Configuration

答案 2 :(得分:0)

我同意streetpc使用Jakarta Commons配置。

然而,为了专注于你的正则表达式,问题在于默认情况下大多数正则表达式引擎在每行的基础上工作。

例如,在(非常古老的)Perl5Util类(请参阅http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.html)中,您可以读到模式具有以下语法:

[m]/pattern/[i][m][s][x]

m前缀是可选的,可选的尾随选项的含义是:

i    case insensitive match 
m    treat the input as consisting of multiple lines 
s    treat the input as consisting of a single line 
x    enable extended expression syntax incorporating whitespace and comments