【问题标题】:How to get specific characters sequences from URL / String [duplicate]如何从 URL / String 中获取特定的字符序列 [重复]
【发布时间】:2019-12-21 21:57:33
【问题描述】:

我有一个 URL,但我只需要 http_token 的值,即 somedata 在该 URL 中,以便我可以将令牌值作为参数发送到我的代码中。我如何得到它?

网址:

https://website.com/?HTTP_TARGETPORTAL=7&HTTP_TOKEN=somedata&HSID_DOMAIN_URL=...

【问题讨论】:

  • 一种解决方案是为此使用正则表达式。你试过什么?
  • 我没试过你能分享代码吗?
  • 不,对不起,我不会分享代码。 StackOverflow 用于帮助解决特定的编码问题,而不是代码共享站点。请先尝试一下,如果您再遇到困难,我们可以提供帮助。
  • 正则表达式允许您定义一个模式并尝试匹配它。例如,这是您如何验证给定字符串是否为有效电子邮件格式 (text.text@text.com) 的方法。查看此网站了解更多详情:regular-expressions.info

标签: java oop url


【解决方案1】:

我没有使用过 Java 正则表达式,但整个事情应该是这样的。

我不确定这是否可行。有很多方法可以达到预期的结果,但这里是正则表达式的方法。

String line = ""; // URL HERE
String pattern = "HTTP_TOKEN=(.+)[&]*";

// Create a Pattern object
Pattern r = Pattern.compile(pattern);

// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println("HTTP TOKEN: " + m.group(1) );
}else {
    System.out.println("NOT FOUND");
}

正则表达式预览: https://regex101.com/r/mA8bPg/2

【讨论】:

  • 我喜欢你的解决方案。一个小的修正是&。它可能存在也可能不存在。所以可能需要[&]*
  • @SunilDabburi 正则表达式在我测试时工作正常。如果我在某个地方犯了错误,请纠正我。谢谢。
  • 它适用于给定的 URL。如果令牌是 URL 中的最后一个键,它可能与您的正则表达式不匹配
  • @SunilDabburi 是的,你是对的。 ? 谢谢。
【解决方案2】:

您可以将您的字符串传递给URL 并获取查询参数。

这是一个基于答案的可行解决方案:Parse a URI String into Name-Value Collection

public static void main(String[] args) {

    String givenUrl = "https://healthsafeid-stage1.optum.com/protected/accountreset/password?HTTP_TARGETPORTAL=LAWW&HTTP_TARGETURL=https%3A%2F%2Fsr-smsc-stg.liveandworkwell.com%2Fservices%2Fsecure%2Fgn&HTTP_ERRORURL=https%3A%2F%2Fsr-smsc-stg.liveandworkwell.com%2Fcontent%2Fen%2Fpublic%2Ferror.html&HTTP_ACCESSTYPE=TIER1&HTTP_BRANDURL=&HTTP_LANGUAGE=en&HTTP_ACCESSCODE=12345678&HTTP_GRADIENTCOLOR1=&HTTP_GRADIENTCOLOR2=&HTTP_TOKEN=GthzXwVHL2xyAdMsHukFPGrSrP6GJHItc%2BEucuznsQk0%2FEhFrjTfr6r0fL16SKOQvus7y5dHmZ1LP3jUJtvY2w%3D%3D&HSID_DOMAIN_URL=https%3A%2F%2Fhealthsafeid-stage1.optum.com";

    try {
        URL url = new URL(givenUrl);
        Map<String, String> query_pairs = new HashMap<>();
        String query = url.getQuery();
        String[] pairs = query.split("&");
        for (String pair : pairs) {
            int idx = pair.indexOf("=");
            query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8").toUpperCase(), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
        }

        String httpToken = query_pairs.get("HTTP_TOKEN");
        System.out.println("Http token: " + httpToken);
    } catch (MalformedURLException | UnsupportedEncodingException e) {
        // log and handle the exception
    }
}

输出:

Http token: GthzXwVHL2xyAdMsHukFPGrSrP6GJHItc%2BEucuznsQk0%2FEhFrjTfr6r0fL16SKOQvus7y5dHmZ1LP3jUJtvY2w%3D%3D

这种方法的优势:

  1. 不依赖于查询参数的顺序
  2. 还解析其他参数。如果将来需要,它们也可以存储起来。

【讨论】:

  • 已尝试:String params1 = "URLllllllllllllllllll";尝试 { 模式 p = Pattern.compile("HTTP_TOKEN=([^&]+)");匹配器 m = p.matcher(params1); while (m.find()) { System.out.println(m.group()); } } catch (PatternSyntaxException ex) { // 错误处理 } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2019-10-08
  • 2020-11-04
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多