如何使用Delimiter扫描仪解析文件

时间:2014-12-31 10:27:10

标签: java

我正在使用Java Scanner类来分隔字符串

这是我的字符串

%22locations%22:[{%22linkId%22:21737516,%22latLng%22:{%22lat%22:12.9219,%22lng%22:77.56022},%22type%22:%22s%22},

{%22linkId%22:21741609,%22latLng%22:{%22lat%22:12.921509,%22lng%22:77.49382},%22type%22:%22s%22},

{%22linkId%22:18632091,%22latLng%22:{%22lat%22:12.904157,%22lng%22:77.470489},%22type%22:%22v%22},

{%22linkId%22:76684742,%22latLng%22:{%22lat%22:12.88959,%22lng%22:77.45314},%22type%22:%22s%22}

我希望输出为

locations:[{latLng:{lat:12.9219,lng:77.56022},type:'s'},

{latLng:{lat:12.921509,lng:77.49382},type:'s'},

{latLng:{lat:12.904157,lng:77.470489},type:'v'},

{latLng:{lat:12.88959,lng:77.45314},type:'s'}
]

这是我的代码

s.useDelimiter("%22|linkId:\\d+,");

我无法删除linkid:integer并在type值附近添加单引号,例如's'代替s

2 个答案:

答案 0 :(得分:1)

不需要Scanner,只需使用String.replaceAll

首先删除所有%22, 然后删除所有linkId:..., 最后在类型值周围添加引号:

 String output = input.replaceAll("%22", "")
                      .replaceAll("linkId:\\d+,", "")
                      .replaceAll("type:(.)", "type:'$1'");

答案 1 :(得分:0)

您的分隔符无法接受linkId:\\d+,因为您的字符串不包含linkId:21741609linkId%22:21741609等连续数据。

所以你需要使用

s.useDelimiter("%22|linkId%22:\\d+,");

但是使用扫描仪无法将s更改为's',因为扫描程序只能用于读取(或跳过某些)数据,而不能用于添加数据。您最好的解决方案是阅读整个字符串,然后将其内容更改为.replaceAll("type:(\\w)", "type:'$1'") mentioned by @geert3