【问题标题】:Replace the property value using RegEx使用 RegEx 替换属性值
【发布时间】:2009-06-16 20:12:26
【问题描述】:

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

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

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

# A property
A = 1\
     2

# B property
B = 2

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

# A property
A = 3

# B property
B = 2

我当前的 RegEx (?s)(A[\\s]*=[\\s]*)(.*) 无法正常工作。

请建议使用正则表达式或其他方式。

谢谢!

【问题讨论】:

    标签: java regex properties


    【解决方案1】:

    试试这个:

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

    我留下了你写的第一部分,所以我可以专注于匹配值;管理键和分隔符的规则实际上要复杂得多。

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

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

    【讨论】:

      【解决方案2】:

      您有 Java 工具来加载、读取、修改和保存属性文件。

      我个人喜欢Jakarta Commons Configuration

      【讨论】:

      • 这绝对是一个更好的方法。
      【解决方案3】:

      我同意 streetpc 使用 Jakarta Commons 配置。

      然而,要专注于您的正则表达式,问题是大多数正则表达式引擎默认以每行为基础工作。

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

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

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

      我不区分大小写匹配 m 将输入视为由多行组成 s 将输入视为由单行组成 x 启用包含空格和 cmets 的扩展表达式语法

      【讨论】:

      • /m 和 /s 修饰符的名称具有误导性;他们所做的只是改变'^'、'$'和'.'的行为。元字符。将正则表达式应用于整个文件还是一次应用于一行完全取决于您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2014-12-16
      相关资源
      最近更新 更多