java 如何转义属性文件中的等号

aiqt4smr  于 2022-12-25  发布在  Java
关注(0)|答案(9)|浏览(278)

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

table.whereclause=where id=100
mefy6pfw

mefy6pfw1#

在你的例子中,你不需要转义等于,你只需要转义它,如果它是键的一部分.属性文件格式会把第一个未转义的等于之后的所有字符作为值的一部分.

xzlaal3s

xzlaal3s2#

另外,请参考javadoc上Property类的**load(Reader reader)**方法
load(Reader reader)方法文档中,它表示
关键字包含该行中从第一个非空白字符开始直到(但不包括)第一个未转义的'='':'或除行终止符以外的空白字符的所有字符。所有这些关键字终止字符都可以通过使用前面的反斜杠字符进行转义而包含在关键字中;例如,

\:\=

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

uxhixvfz

uxhixvfz3#

Java中默认的转义字符是“\”。
然而,Java属性文件有格式key=value,它应该考虑第一个equal之后的所有内容作为value。

crcmnpdw

crcmnpdw4#

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

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文件内容的简单方法,而且你可以根据自己的需要放置任意多的属性。

cedebl8k

cedebl8k5#

在我的情况下,两个前导的"\"对我来说很好。
例如:如果单词包含'#'字符(例如aa#100,您可以使用两个前导'\'对其进行转义

key= aa\\#100
xxe27gdn

xxe27gdn6#

您可以查看此处Can the key in a Java property include a blank character?
转义等于'=' \u003d
表。其中子句=其中ID=100
键:[表.所在子句]值:[其中ID=100]
表格.位置条件其中id=100
键:[表.位置子句=其中]值:[ID=100]
表格.位置子句位置
键:[表.位置子句=其中ID=100]值:[]

zbsbpyhn

zbsbpyhn7#

在Spring或Sping Boot 的application.properties文件中这里是特殊字符的转义方法;
表。其中子句=其中ID '=' 100

nhjlsmyf

nhjlsmyf8#

此方法应有助于以编程方式生成保证与.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"

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

n6lpvg4x

n6lpvg4x9#

我已经能够在字符“”内输入值:

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

相关问题