【问题标题】:How to extract id from url ? Google sheet如何从 url 中提取 id?谷歌表
【发布时间】:2017-08-07 04:37:35
【问题描述】:

我有以下网址。

https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY/edit#gid=1842172258
https://docs.google.com/a/example.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6PTKTzY0xOM5c6TXY/edit#gid=1842172258
https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY

Foreach url,我需要将工作表 id:1mrsetjgfZI2BIypz7SGHMOfHGv6PTKTzY0xOM5c6TXY 提取到 java 字符串中。

我正在考虑使用 split,但它不能适用于所有测试用例:

String string = "https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY/edit#gid=1842172258";
String[] parts = string.split("/");
String res = parts[parts.length-2];
Log.d("hello res",res );

这怎么可能?

【问题讨论】:

  • ID 总是跟在 /spreadsheets/d/ 后面吗?如果是这样,那么您可以编写一个查找 /spreadsheets/d/ 的正则表达式,然后捕获其后的组件。你不需要使用split。您仍然可以使用split 并搜索等于“电子表格”和“d”的数组元素。如果在其他情况下 ID 不符合此要求,则您必须弄清楚可能性是什么。

标签: java string url google-sheets-api


【解决方案1】:

您可以使用正则表达式\/d\/(.*?)(\/|$) (regex demo) 来解决您的问题,如果您仔细观察,您会发现ID 存在于d//end of line 之间,因为您可以获得所有信息在这之间,检查这个代码演示:

String[] urls = new String[]{
    "https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY/edit#gid=1842172258",
    "https://docs.google.com/a/example.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6PTKTzY0xOM5c6TXY/edit#gid=1842172258",
    "https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY"
};

String regex = "\\/d\\/(.*?)(\\/|$)";
Pattern pattern = Pattern.compile(regex);

for (String url : urls) {
    Matcher matcher = pattern.matcher(url);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
}

输出

1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY
1mrsetjgfZI2BIypz7SGHMOfHGv6PTKTzY0xOM5c6TXY
1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY

【讨论】:

    【解决方案2】:

    看起来您要查找的 id 始终遵循“/spreadsheets/d/”,如果是这种情况,您可以将代码更新为该

            String string = "https://docs.google.com/spreadsheets/d/1mrsetjgfZI2BIypz7SGHMOfHGv6kTKTzY0xOM5c6TXY/edit#gid=1842172258";
            String[] parts = string.split("spreadsheets/d/");
            String result;
            if(parts[1].contains("/")){
                String[] parts2 = parts[1].split("/");
                result = parts2[0];
            }
            else{
                result=parts[1];
            }
            System.out.println("hello "+ result);
    

    【讨论】:

      【解决方案3】:

      使用正则表达式

      Pattern pattern = Pattern.compile("(?<=\\/d\\/)[^\\/]*");
      Matcher matcher = pattern.matcher(url);
      System.out.println(matcher.group(1));
      

      使用 Java

      String result = url.substring(url.indexOf("/d/") + 3);
      int slash = result.indexOf("/");
      result =  slash == -1 ? result
                            : result.substring(0, slash);
      System.out.println(result);
      

      【讨论】:

        【解决方案4】:

        Google 对其 ID 使用固定长度的字符,在您的情况下,它们是 44 个字符,这些是 google 使用的字符:字母数字、- 和 _,因此您可以使用此正则表达式:

        regex = "([\w-]){44}"
        match = re.search(regex,url)
        

        【讨论】:

          猜你喜欢
          • 2013-01-30
          • 1970-01-01
          • 2023-02-09
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          相关资源
          最近更新 更多