请问 Java 的 String 如何使用正则表达式截取需要的部分,比如 callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )中获取 openid?

2019 年 8 月 25 日
 Newyorkcity

我觉得要是可以

String s = "callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )".somemethod("^{.*}$");
//s = "client_id":"YOUR_APPID","openid":"YOUR_OPENID"
然后 String params = s.split(",");
for(String param: params){
   if(param.contains("openid")){ String keyvalue = param.split(":"); String openid = keyvalue[1] }
}

就好了。。 就差这个 somemethod,我看了官方文档,好像没有合适的方法。。不知道该如何绕远路去实现

谢谢

3255 次点击
所在节点    问与答
17 条回复
LxExExl
2019 年 8 月 25 日
额 这不应该是 parse 一个接森🐴
CFO
2019 年 8 月 25 日
把 json 转对象再操作会更爽吧
AlisaDestiny
2019 年 8 月 25 日
不如试试用冒号分割?
s.split("\"")[7]
Newyorkcity
2019 年 8 月 25 日
@CFO
@LxExExl
这个直接 prase 为 JSON 吗? JSON 的格式不是不应该有外面那层 callback()的么?
Duolingo
2019 年 8 月 25 日
JSONObject.parseObject(s, HashMap.class).get("openid")
Newyorkcity
2019 年 8 月 25 日
@AlisaDestiny 666 这个操作确实可以,就是语义上不太好理解,而且万一要是返回的参数的位置换了一下就玩完了。不过还是很感谢
Duolingo
2019 年 8 月 25 日
JSON 外还有啊。。。那用正则匹配一下 JSON 字符串😅
Trim21
2019 年 8 月 25 日
先处理字符串,把前面的 callback(和最后一个)去掉再解析成 json
Newyorkcity
2019 年 8 月 25 日
@codingadog
@Trim21
。。。所以这个问题就是问怎么用正则表达式筛出有意义的字符串。。我最不知道该怎么做的就是删掉只有副作用的那些字符
Duolingo
2019 年 8 月 25 日
@Newyorkcity 如果确定返回值中只会有一对大括号的话,直接正则匹配大括号,然后随便转 map 还是别的方式处理就行呗
azh7138m
2019 年 8 月 25 日
这是 JSONP 格式,直接把第一个 "(" 前面的,最后一个 ")" 后面的去掉,当 JSON 解析就行了
不过话说回来,一个接口如果有 JSONP 返回,一般就会有一个参数可以控制返回 JSON
mxalbert1996
2019 年 8 月 25 日
Pattern.compile("^\{.*)\}$").matcher(s).group(0)
mxalbert1996
2019 年 8 月 25 日
@mxalbert1996 多打了一个括号
glaucus
2019 年 8 月 25 日
我以前做过这个,我的做法是匹配()括号取括号中的内容,然后转 json 再取字段,至于如何匹配()这是一个经典算法题,Leetcode 上也有,楼主可以搜一下
mrcn
2019 年 8 月 25 日
从前往后找第一个(
从后往前找第一个)
两个位置一减就是长度
然后 substr 取出来
lawler
2019 年 8 月 25 日
哈哈哈哈,突然想皮一下。

ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("js");
scriptEngine.eval("function callback(data){return data.openid;}");
scriptEngine.eval(s); // 这里接收你的结果
allenhu
2019 年 8 月 28 日
如果你智力正常,最先想到的不该是 找到 "openid":" 和 "} 的位置,然后通过 substring 来截取么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/594898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX