我有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或其他方式。
谢谢!
答案 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工具加载,读取,修改和保存属性文件。
答案 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