背景
业余时间又爬了下网站,这回碰到点问题,爬下来的数据有点奇葩。说是 xml 格式吧,又有些奇怪的东西,而且时不时来个,有效数据还被 和 包着在。这里我截取了部分贴出来:(为了方便查看,做了简单的格式化)
如何解析这个数据并不是难事,Jsoup轻松搞定,至于如何使用Jsoup,不是本文重点,这里不做介绍。
Jsoup解析数据时,只能解析到标签,比如上面的 title,通过Jsoup解析出来就是:
前面已经说过了,有效数据是 和 中间夹着的部分,如果就这么几个字串,那通过字符串截取方法也能轻松拿到有效数据。但是上面贴出来的只是局部,实际整个数据是一个list,里面有很多的 和 ,如果一个个去截取字串,无疑会很繁琐。
因此我的做法是:先将整个数据进行字符串替换,将 和 替换为空串;然后交给Jsoup去解析,这样就可以直接一个循环一步到位了。
字符串替换
基于上面的思路,如何一次性替换掉所有的 和 就成了关键。好在 String 类就有替换方法:和,我们直接拿过来用就可以了。
但是我这里就被这两个方法的名字迷惑了,想着是替换全部的 和 嘛,那在合适不过了。于是就这么用了:
结果这么一写出来,AS 就在提示参数有问题:。
这下懵了,然后老老实实看了下 replaceAll 的说明:
Replaces each substring of this string that matches the given regular expression with the given replacement.
replaceAll 实现方式:
意思很明显,第一个参数 regex 是正则表达式,这个方法的作用就是用 replacement 去替换所有满足 regex的内容。而也是正则表达式的关键字符,因此这里没有经过处理直接使用就出现了参数问题。
这里我对正则表达式了解的不多,也就没有深究 replaceAll 方法了,转而看了下 replace 的说明和实现:
这里意思就是说,替换每一个满足条件的字串。而且替换过程是从字符串开始到结束单向的,不会出现倒退;比如说:在里面用替换,结果是,而不是。用也就是说 replace 和 replaceAll 不是字面意思,它俩都是替换所有满足条件的内容。
另外,这里replace的实现方式也非常严谨,对的情况也进行了处理,处理方式是在原字串首尾和其所有字符之间都添加 replacement。举个栗子:
结果是:
小结
1、replace 和 replaceAll 都是替换所有满足条件的内容,只不过replace的匹配条件是普通的字串,而replaceAll的匹配条件是正则表达式。
2、当要被处理的字符串比较庞大时,replaceAll 的效率总是比 replace 的快一些;当字符串量不大时,二者效率不相上下。
3、当字符串无法确定是否具有转义字符时,而且也不需要转义时,建议使用 replace 函数;否则,使用 replaceAll 函数。
领取专属 10元无门槛券
私享最新 技术干货