V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2019-08-25 13:35:05 +08:00 · 2554 次点击
    这是一个创建于 1936 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我觉得要是可以

    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,我看了官方文档,好像没有合适的方法。。不知道该如何绕远路去实现

    谢谢

    第 1 条附言  ·  2019-08-25 20:06:27 +08:00
    最准确的答案应该是
    mxalbert1996 的

    Pattern.compile("\\{.*\\)").matcher(s).group(0)
    第 2 条附言  ·  2019-08-25 20:08:11 +08:00
    不过这个答案有一个坑,那就是通过 Pattern.compile("\\{.*\\)").matcher(s)得到一个 Matcher 对象后,如果不执行 Matcher 的 find()方法,实际上是得不到最终结果的。也就是说这么写才完整
    Matcher m = Pattern.compile("\\{.*\\)").matcher(s);
    m.find()
    return m.group(0)
    17 条回复    2019-08-28 16:31:07 +08:00
    LxExExl
        1
    LxExExl  
       2019-08-25 13:40:45 +08:00
    额 这不应该是 parse 一个接森🐴
    CFO
        2
    CFO  
       2019-08-25 13:42:00 +08:00 via Android
    把 json 转对象再操作会更爽吧
    AlisaDestiny
        3
    AlisaDestiny  
       2019-08-25 13:43:28 +08:00   ❤️ 1
    不如试试用冒号分割?
    s.split("\"")[7]
    Newyorkcity
        4
    Newyorkcity  
    OP
       2019-08-25 13:43:41 +08:00
    @CFO
    @LxExExl
    这个直接 prase 为 JSON 吗? JSON 的格式不是不应该有外面那层 callback()的么?
    codingadog
        5
    codingadog  
       2019-08-25 13:44:10 +08:00 via Android
    JSONObject.parseObject(s, HashMap.class).get("openid")
    Newyorkcity
        6
    Newyorkcity  
    OP
       2019-08-25 13:44:55 +08:00
    @AlisaDestiny 666 这个操作确实可以,就是语义上不太好理解,而且万一要是返回的参数的位置换了一下就玩完了。不过还是很感谢
    codingadog
        7
    codingadog  
       2019-08-25 13:45:41 +08:00 via Android
    JSON 外还有啊。。。那用正则匹配一下 JSON 字符串😅
    Trim21
        8
    Trim21  
       2019-08-25 13:47:00 +08:00 via Android
    先处理字符串,把前面的 callback(和最后一个)去掉再解析成 json
    Newyorkcity
        9
    Newyorkcity  
    OP
       2019-08-25 13:51:17 +08:00
    @codingadog
    @Trim21
    。。。所以这个问题就是问怎么用正则表达式筛出有意义的字符串。。我最不知道该怎么做的就是删掉只有副作用的那些字符
    codingadog
        10
    codingadog  
       2019-08-25 13:53:05 +08:00 via Android
    @Newyorkcity 如果确定返回值中只会有一对大括号的话,直接正则匹配大括号,然后随便转 map 还是别的方式处理就行呗
    azh7138m
        11
    azh7138m  
       2019-08-25 14:09:12 +08:00
    这是 JSONP 格式,直接把第一个 "(" 前面的,最后一个 ")" 后面的去掉,当 JSON 解析就行了
    不过话说回来,一个接口如果有 JSONP 返回,一般就会有一个参数可以控制返回 JSON
    mxalbert1996
        12
    mxalbert1996  
       2019-08-25 14:49:48 +08:00 via Android   ❤️ 1
    Pattern.compile("^\{.*)\}$").matcher(s).group(0)
    mxalbert1996
        13
    mxalbert1996  
       2019-08-25 14:50:44 +08:00 via Android
    @mxalbert1996 多打了一个括号
    glaucus
        14
    glaucus  
       2019-08-25 14:53:52 +08:00 via iPhone
    我以前做过这个,我的做法是匹配()括号取括号中的内容,然后转 json 再取字段,至于如何匹配()这是一个经典算法题,Leetcode 上也有,楼主可以搜一下
    mrcn
        15
    mrcn  
       2019-08-25 15:40:50 +08:00 via Android   ❤️ 1
    从前往后找第一个(
    从后往前找第一个)
    两个位置一减就是长度
    然后 substr 取出来
    lawler
        16
    lawler  
       2019-08-25 19:40:47 +08:00
    哈哈哈哈,突然想皮一下。

    ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("js");
    scriptEngine.eval("function callback(data){return data.openid;}");
    scriptEngine.eval(s); // 这里接收你的结果
    allenhu
        17
    allenhu  
       2019-08-28 16:31:07 +08:00
    如果你智力正常,最先想到的不该是 找到 "openid":" 和 "} 的位置,然后通过 substring 来截取么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5124 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:37 · PVG 15:37 · LAX 23:37 · JFK 02:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.