如何在属性文件中转义等号


84

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

table.whereclause=where id=100

Answers:


83

此外,请javadoc上的类参考load(Reader reader)方法Property

load(Reader reader)方法文档中说

关键包含了所有的从第一个非空格字符以及高达行的字符,但不包括第一转义 '='':'或比行结束符等空白字符。所有这些密钥终止字符都可以通过用前面的反斜杠字符转义来包括在密钥中;例如,

\:\=

将是两个字符的键":=". 可以使用\r\n转义序列包括行终止符。跳过键后的任何空格;如果键之后的第一个非空白字符为'='':',则将其忽略,并且其后的所有空白字符也将被跳过。该行上所有剩余的字符将成为关联元素字符串的一部分;如果没有剩余字符,则该元素为空字符串""。一旦识别出构成键和元素的原始字符序列,就如上所述执行转义处理。

希望能有所帮助。


89

在您的特定示例中,您不需要转义等于-仅在键是键的一部分时才需要转义。属性文件格式将第一个未转义的等号之后的所有字符视为值的一部分。


12
不知道为什么这个还没有被标记!最简单的正确答案!大多数时候,人们正在寻找属性文件中的转义值!
Tejas

1
小修正:将第一个未转义的等号和尾部空格(即中的前导空格)删除后的所有字符都视为。示例“ myKey =我的值”与“ myKey =我的值”相同。
Paulo Merson

23

Java中的默认转义字符为“ \”。
但是,Java属性文件的格式为key = value,因此应将第一个等于之后的所有内容都视为value。


7
除了前导空格(哦,不需要键和值之间的'=',它可以是:或空格)
Brad Cupit 2011年

16

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

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文件内容的简单方法,该内容可以保证是正确的。您可以根据需要放置任意多个属性。


6

就我而言,两个前导“ \\”对我来说很好。

例如:如果您的单词包含'#'字符(例如aa#100,则可以使用两个前导'\\'对其进行转义

   key= aa\\#100


我同意,您需要两个反斜线(glassfish 4.1,内部版本13)
Susanta

2

您可以在此处查看Java属性中的键可以包含空白字符吗?

对于转义等于'='\ u003d

table.whereclause =其中id = 100

键:[table.whereclause]值:[where id = 100]

table.whereclause \ u003dwhere id = 100

键:[table.whereclause = where]值:[id = 100]

table.whereclause \ u003dwhere \ u0020id \ u003d100

键:[table.whereclause =其中id = 100]值:[]


2

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

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


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"

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


-1

我已经可以在字符“”内输入值:

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

为什么要投票?这是一个真正的答案:)
russellhoff

Op说Java属性,而引号在Java属性文件中不起作用。
teknopaul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.