场景:
配置文件config.properties
配置项cfg.regexp=\d+\t
加载配置文件代码
InputStream ins = PropManager.class.getResourceAsStream("/config.properties");
prop.load(ins);
现象:
打印cfg.regexp的值输出为"d+ ",而不是期望的"\d+\t"
原因:
看了下代码,发现Properties类对'\'做了转义处理,而且只处理'\uxxxx', '\t','\n','\r','\f'这几种情况,对于其他情况,就简单的把'\'吞掉了
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if(aChar == 'u') {
// Read the xxxx
int value=0;
for (int i=0; i<4; i++) {
aChar = in[off++];
switch (aChar) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
value = (value << 4) + aChar - '0';
break;
case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
out[outLen++] = (char)value;
} else {
if (aChar == 't') aChar = '\t';
else if (aChar == 'r') aChar = '\r';
else if (aChar == 'n') aChar = '\n';
else if (aChar == 'f') aChar = '\f';
out[outLen++] = aChar;
}
} else {
out[outLen++] = (char)aChar;
}
}
解决方法:
我的解决方法是,自己写个简单的解析
约定
- 每行第一次出现的'='作为分割符(Properties类可以支持key:value格式)
- key和value都忽略前后空白字符
- 不对字符串做转义处理
while((line = buffReader.readLine())!=null){
line = line.trim();
if(line.startsWith("#") || line.equals("")){// 忽略#开头的注释
continue;
}
int index = line.indexOf('=');
if(index <= 0){
logger.error("********错误的配置文件格式!********line = " + line);
continue;
}
String key = line.substring(0, index).trim();
String value = (index+1>=line.length()) ? "":line.substring(index+1).trim();// 避免越界
prop.put(key, value);
}
之所以把它记下来是因为我跟同事说起这个现象的时候,同事发现他之前写的代码用过类似的正则表达式配置方式,正则表达式里面希望匹配绝对的'\.',而经过Properties类转义之后变成了'.',意义就变成了“任意字符”,由于运行并不报错,而且某系情况下结果还是正确的,于是一个潜在的bug就出现了
分享到:
相关推荐
"java csv 读写框架特殊字符转义" Java CSV 读写框架是基于 Java 注解的 CSV 读写框架...Java CSV 读写框架提供了一个强大的解决方案来处理 CSV 文件中的特别字符转义问题,使得我们可以轻松地处理 CSV 文件中的数据。
Unicode工具为您的 UTF-8 java 属性文件转义或取消转义
常见转义字符列表,没有什么技术含量,只是为了记忆方便
JAVA转义字符
Java 中 HTML 转义与反转义工具类 代码如下 import org.apache.commons.lang3.StringUtils; /** * 转义和反转义工具类 * */ public class EscapeUtil { private static final char[][] TEXT = new char[64][]; ...
粗浅整理了java的关键字、标识符、注释、转义字符相关知识,十分浅显,这也是现阶段所能理解的程度,希望以后能够更加深入的理解
Java转义字符,适合初学者,Java转义字符 1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个十六进制数字;0~65535 \u0000:空字符 3.特殊字符:就3个 \":双引号 ...
第02章 Java编程基础 05 关键字与转义字符
JAVA转义字符[文].pdf
自己总结的Java转义字符 很好用 方便查阅
由于正则表达式定了一些特殊字符,而有时候需要对这些特殊字符进行匹配的话就需要进行转义了,下面这篇文章主要给大家介绍了Java正则表达式处理特殊字符转义的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
首要条件需要由adb 环境 第一步:先安装插件 adb shell ime set ... 第二步:就是使用命令输入了 adb shell am broadcast -a ADB_INPUT_TEXT -es msg '我喜欢AIMING & 爱上^ 2' 用法很简单,你学废了吗?
JAVA实现html转义字符及css清除_.docx
java中常见的转义字符,收集的,很有用
主要介绍了一个静态文件处理的一些便捷服务,包括java清除html转义字符,清除html代码,从style样式中读取CSS的属性,将字符串截取指定长度,涉及log4j,common-lang类的学习
纯原创 优化Android与服务器高效率交互,无转义问题 提高了交互效率,复用性强、处理了劣质网络通信问题。
HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...
转义表单提交字符处理函数,可用于php或javascript的字符处理函数列表
JAVA中转义字符 1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个十六进制数字;0~65535 \u0000:空字符 3.特殊字符:就3个 \":双引号 \':单引号 \\:反...
此为 java反编译工具class转义工具,实际开发中确定java类是否编译成功的工具