如何转义等号登录属性文件

时间:2010-03-09 06:00:34

标签: java properties escaping

如何在Java属性文件中转义等号(=)?我想在我的文件中添加以下内容:

table.whereclause=where id=100

9 个答案:

答案 0 :(得分:75)

此外,请参阅load(Reader reader) method from Property class on javadoc

load(Reader reader)方法文档中,它说

  

该键包含所有字符   在从第一个开始的行中   非空白字符和最多,   但不包括,第一个没有转义   '='':'或空格字符   除了行终止符。所有的   这些关键的终止字符可能   通过转义包含在密钥中   他们有一个前面的反斜杠   字符;例如,

\:\=
     

将是双字符键":=".   行终止符可以是   包括使用\r\n转义   序列。任何空白之后   键被跳过;如果第一个非白色   密钥后的空格字符为'='   或':',然后它被忽略,任何   它之后的空白字符   也跳过了。所有剩余的字符   在线上成为了一部分   相关元素串;如果有   没有剩下的角色,   element是空字符串""。一旦   原始字符序列   构成关键和要素的是   确定,逃避处理是   如上所述进行。

希望有所帮助。

答案 1 :(得分:72)

在您的具体示例中,您不需要转义等于 - 如果它是键的一部分,您只需要转义它。属性文件格式将在第一个未转义的等于作为值的一部分之后处理所有字符。

答案 2 :(得分:20)

Java中的默认转义字符是'\'。
但是,Java属性文件的格式为key = value,它应该考虑第一个等于值后的所有内容。

答案 3 :(得分:14)

避免此类问题的最佳方法是以编程方式构建属性然后存储它们。例如,使用如下代码:

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

这将向System.out输出正确转义的版本。

在我的情况下,输出是:

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

正如您所看到的,这是一种生成.properties文件内容的简便方法,这些文件保证是正确的。您可以根据需要添加任意数量的属性。

答案 4 :(得分:5)

在我的情况下,两个领先的'\\'对我来说很好。

例如: 如果你的单词包含'#'字符(例如aa#100,你可以用两个来逃避它) 领先'\\'

   key= aa\\#100

答案 5 :(得分:2)

你可以看看Can the key in a Java property include a blank character?

for escape equal'='\ u003d

table.whereclause =其中id = 100

key:[table.whereclause] value:[where id = 100]

table.whereclause \ u003d where id = 100

key:[table.whereclause = where] value:[id = 100]

table.whereclause \ u003dwhere \ u0020id \ u003d100

key:[table.whereclause = where id = 100] value:[]

答案 6 :(得分:0)

在Spring或Spring引导application.properties文件中,这是转义特殊字符的方法;

table.whereclause =其中id'\ ='100

答案 7 :(得分:0)

此方法应有助于以编程方式生成保证与.properties文件100%兼容的值:

public static String escapePropertyValue(final String value) {
    if (value == null) {
        return null;
    }

    try (final StringWriter writer = new StringWriter()) {
        final Properties properties = new Properties();
        properties.put("escaped", value);
        properties.store(writer, null);
        writer.flush();

        final String stringifiedProperties = writer.toString();
        final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
        final Matcher matcher = pattern.matcher(stringifiedProperties);

        if (matcher.find() && matcher.groupCount() <= 2) {
            return matcher.group(matcher.groupCount());
        }

        // This should never happen unless the internal implementation of Properties::store changed
        throw new IllegalStateException("Could not escape property value");
    } catch (final IOException ex) {
        // This should never happen. IOException is only because the interface demands it
        throw new IllegalStateException("Could not escape property value", ex);
    }
}

您可以这样称呼它:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

这种方法有点昂贵,但是将属性写入文件通常是一个偶然的操作。

答案 8 :(得分:-1)

我已经能够在角色&#34;中输入值:

db_user="postgresql"
db_passwd="this,is,my,password"