您好我一直试图让正则表达式替换JSON字符串键名中的点(。)。我不想使用JSONObject将字符串转换为JSON。
因此对于JSON字符串,如:
{
"data": {
"property": "0",
"property_value": "0",
"property": "0",
"pro.per.ty": "0",
"pr.op.er.ty": "0.0",
"property": "0.0",
"proper_ty": "0.0",
"group": "oneGroup",
"newprop": "0",
"total": {
"0": "0",
"99": "0",
"100": "0",
"25": "0",
"90": "0",
"50": "0",
"95": "0",
"99.5": "0",
"75": "0"
},
"requests": "0"
}
}
我希望最后一个字符串是
{
"data": {
"property": "0",
"property_value": "0",
"property": "0",
"pro_per_ty": "0",
"pr_op_er_ty": "0.0",
"property": "0.0",
"proper_ty": "0.0",
"group": "oneGroup",
"newprop": "0",
"total": {
"0": "0",
"99": "0",
"100": "0",
"25": "0",
"90": "0",
"50": "0",
"95": "0",
"99_5": "0",
"75": "0"
},
"requests": "0"
}
}
解决方案需要在10毫秒的时间内保持高性能。
我可以使用表达式"(\w*\.\w*)+\":
使用(。)捕获键,但是我无法正确地获取子组以执行替换。
答案 0 :(得分:0)
我能够提出以下内容,但不确定是否可以通过减少创建的String
个对象的数量来改善这个目标
String cleanse(final String jsonString){
Pattern pattern = Pattern.compile("((?:\\w*\\.\\w*)+)\"\\s*?:");
String str = jsonString;
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
str = str.replace(matcher.group(1),matcher.group(1).replaceAll("\\.","_"));
}
return str;
}
答案 1 :(得分:0)
您还可以考虑以下非基于正则表达式的方法:
public static String cleanse( String str )
{
String updated = Arrays.stream( str.split( "," ) ).map( value -> {
if ( !value.contains( ":" ) )
{
return value;
}
String[] pair = value.split( ":" );
StringBuilder sb = new StringBuilder();
int i = 0;
while ( i < pair.length - 1 )
{
sb.append( pair[i] ).append( ":" );
i++;
}
return sb.toString().replace( '.', '_' ) + pair[i];
} ).collect( Collectors.joining( "," ) );
return updated;
}
因为它没有使用模式匹配所以它应该是高性能的。