项目实战:RequestUrl的处理(思考 + Sting API > KMP等复杂算法、正则表达式)

来源:互联网 发布:android直播rtmp源码 编辑:程序博客网 时间:2024/06/07 08:50

今天从项目中抽取了一个点进行分析,大概情形就是在项目中我们请求了大量参数,想非常直观的从这些参数中挑出一些特定信息并将它显示出来,这就涉及到了字符串的处理。

例如给定这样一个requestUrl:

private static String requestUrl = "http://xxxtest.11111111.com:9988" + "/resource/x/xxx/xxxsupport/xxxOrder/list" + "?q=zzz2VeREWb2S-tVPSvHugtM8l5ZQrypAJ6m0K0ezEIM%3D&cid=111330&uid=zzz522aa-8755-4a29-b984";
我只想看到其中的接口信息:
/resource/x/xxx/xxxsupport/xxxOrder/list

这样一个小Feature。


观察目标字符串后,立刻判断,先通过:拆分requestUrl得到

http
//xxxtest.11111111.com
9988/resource/x/xxx/xxxsupport/xxxOrder/list?q=zzz2VeREWb2S-tVPSvHugtM8l5ZQrypAJ6m0K0···


在通过?拆分requestUrl[2]得到:

9988/resource/x/xxx/xxxsupport/xxxOrder/list
q=zzz2VeREWb2S-tVPSvHugtM8l5ZQrypAJ6m0K0ezEIM%3D···


最后摘取字符串requestUrl[2][0]即可:

/resource/x/xxx/xxxsupport/xxxOrder/list


源代码如下:

String[] Array1 = requestUrl.split(":");for(String temp : Array1){System.out.println(temp);}String[] Array2 = Array1[2].split("\\?");for(String temp : Array2){System.out.println(temp);}System.out.println(Array2[0].substring(4));

测试无误,简单的case,搞定。


然而我还是太天真,我在测试环境下跑通了case,过了一天,项目切到了预生产环境,RequestUrl变成了这个东西:

private static String requestUrl_new = "http://xxxtest.11111111.com" + "/resource/x/xxx/xxxsupport/xxxOrder/list" + "?q=zzz2VeREWb2S-tVPSvHugtM8l5ZQrypAJ6m0K0ezEIM%3D&cid=1113";


亲,你发现有啥区别了吗?端口号没了!

所以最后运行的结果变成了:
http
//xxxtest.11111111.com/resource/x/xxx/xxxsupport/xxxOrder/list?q=zzz2VeREWb2S-

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at com.car.quan.String.RequestUrlStringTest.main(RequestUrlStringTest.java:28)


因为之前的requestUrl[2]没了导致数组越界异常,崩。


平复下心情,分析字符串,寻找新思路:

找出requestUrl的通用特征。

先通过?拆分requestUrl得到:

http://xxxtest.11111111.com/resource/x/xxx/xxxsupport/xxxOrder/list
q=zzz2VeREWb2S-tVPSvHugtM8l5ZQrypAJ6m0K0ezEIM%3D&cid=111


然后我们在requestUrl[0]中找到通用特征/resource,随后摘取字符串即可。

源代码和结果如下:

System.out.println(requestUrl_new.split("\\?")[0].substring(requestUrl_new.split("\\?")[0].indexOf("/resource")));


/resource/x/xxx/xxxsupport/xxxOrder/list


又验证将requestUrl切回到测试版本也是可行的。

综上,寻找到共性,熟悉Java API并将代码优化至一行。

勤于思考,并不用使用KMP等复杂算法或者正则表达式,仅用String的split、substring、indexof解决小case。



0 0