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

Java 如何在属性文件中转义等号,java,properties,escaping,Java,Properties,Escaping,如何在Java属性文件中转义等号(=)?我想在我的文件中添加以下内容: table.whereclause=where id=100 Java中的默认转义字符是“\” 但是,Java属性文件的格式为key=value,它应该考虑第一个之后的所有内容都等于value。此外,请参阅 在加载(读卡器)方法文档中 该键包含所有字符 从第一个开始排队 非空白字符,最多为, 但不包括第一个未被替换的 “=”,:”,或空白字符 而不是线路终止符。全部 这些关键终止字符可以 通过转义包含在密钥中 在前面加上一

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

table.whereclause=where id=100

Java中的默认转义字符是“\”

但是,Java属性文件的格式为key=value,它应该考虑第一个之后的所有内容都等于value。

此外,请参阅

加载(读卡器)
方法文档中

该键包含所有字符 从第一个开始排队 非空白字符,最多为, 但不包括第一个未被替换的
“=”
:”
,或空白字符 而不是线路终止符。全部 这些关键终止字符可以 通过转义包含在密钥中 在前面加上一个反斜杠 性格比如说,

\:\=
将是两个字符的键
“:=”
行结束符字符可以是 包括使用
\r
\n
转义 序列。后面有空格吗 键被跳过;如果第一个非白色 键后的空格字符为
'='
:'
,则忽略它,并且 后面的空白字符是 也跳过了。所有剩余字符 在线成为网络的一部分 关联元素字符串;如果有 如果没有剩余字符,则 元素是空字符串
“”
。一旦 原始字符序列 构成要素的关键是 已识别,转义处理正在进行 如上所述执行

希望有帮助。

你可以看看这里

对于转义等于“=”\u003d

表.whereclause=其中id=100

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

表.whereclause\u003dwhere id=100

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

表.whereclause\u003dwhere\u0020id\u003d100


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

在您的特定示例中,您不需要转义等号,只要它是键的一部分,您就需要转义它。属性文件格式将把第一个unscaped equals后面的所有字符视为值的一部分。

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

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
这会将正确转义的版本输出到System.out

在我的例子中,输出是:

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

正如您所看到的,这是一种生成.properties文件内容的简单方法,可以保证其正确性。您可以放置任意数量的属性。

在我的例子中,两个前导的“\\”对我来说效果很好

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


key=aa\\\#100
我已经能够在字符中输入值了:


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


table.whereclause=where id'\='100

此方法应有助于以编程方式生成保证与
文件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);
    }
}

这种方法有点贵,但无论如何,将属性写入文件通常是一种零星的操作。

除了前导空格(哦,键和值之间的“=”不是必需的,它可以是:或空白)不知道为什么没有标记!最简单的答案是正确的!大多数情况下,人们都在属性文件中寻找转义值!小更正:将第一个未转义的等号和尾随空格之后的所有字符视为值,即去掉值中的前导空格。例如“myKey=my value”“与“myKey=my value”相同。我认为,您需要两个反斜杠(glassfish 4.1,build 13)为什么要进行向下投票?这是一个真实的答案:)Op说Java属性,引号在Java属性文件中不起作用。
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"