如何=
在Java属性文件中转义等号()?我想在文件中添加以下内容:
table.whereclause=where id=100
Answers:
此外,请从javadoc上的类参考load(Reader reader)方法Property
在load(Reader reader)
方法文档中说
关键包含了所有的从第一个非空格字符以及高达行的字符,但不包括第一转义
'='
,':'
或比行结束符等空白字符。所有这些密钥终止字符都可以通过用前面的反斜杠字符转义来包括在密钥中;例如,\:\=
将是两个字符的键
":=".
可以使用\r
和\n
转义序列包括行终止符。跳过键后的任何空格;如果键之后的第一个非空白字符为'='
或':'
,则将其忽略,并且其后的所有空白字符也将被跳过。该行上所有剩余的字符将成为关联元素字符串的一部分;如果没有剩余字符,则该元素为空字符串""
。一旦识别出构成键和元素的原始字符序列,就如上所述执行转义处理。
希望能有所帮助。
在您的特定示例中,您不需要转义等于-仅在键是键的一部分时才需要转义。属性文件格式将第一个未转义的等号之后的所有字符视为值的一部分。
Java中的默认转义字符为“ \”。
但是,Java属性文件的格式为key = value,因此应将第一个等于之后的所有内容都视为value。
避免此类问题的最佳方法是以编程方式构建属性,然后存储它们。例如,使用如下代码:
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文件内容的简单方法,该内容可以保证是正确的。您可以根据需要放置任意多个属性。
您可以在此处查看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]值:[]
此方法应有助于以编程方式生成保证与.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"
这种方法有点昂贵,但是将属性写入文件通常是一个偶然的操作。
我已经可以在字符“”内输入值:
db_user="postgresql"
db_passwd="this,is,my,password"