【问题标题】:Unable to extract ids from urls无法从 url 中提取 id
【发布时间】:2019-02-14 18:30:30
【问题描述】:

我正在尝试拆分一些 url 以获取位于每个 url 最右侧部分的 id。在其他语言中,有反向索引选项,如[-1] 以拆分最后一部分。但是,我正在努力寻找 vba 中的任何此类选项来解决问题。请将此尝试 Split(linkId, "/")(1) 视为占位符。

如何获取位于不同 url 最右侧部分的 id?

到目前为止我的尝试:

Sub GetId()
    Dim linkId As Variant, linkList As Variant

    linkList = Array( _
        "https://etc.com/en/category/all/all/shops/206898", _
        "https://etc.com/ar/category/all/mobile/350689", _
        "https://etc.com/bn/category/all/bike/760689" _
        )


    For Each linkId In linkList
        Debug.Print Split(linkId, "/")(1)
    Next linkId
End Sub

预期输出:

206898
350689
760689

发布脚本:id 的长度可能并不总是相同。

【问题讨论】:

    标签: excel vba split


    【解决方案1】:

    你想要最右边斜线的索引。 InStr 可以让你得到一个从左边开始的字符的索引,但是你想要的是InStrRev,得到一个从右边开始的字符的索引。

    使用该索引,Mid 函数可以为您获取您所追求的子字符串 - 此代码产生所需的输出:

    Debug.Print Mid(linkId, InStrRev(linkId, "/") + 1)
    

    不需要Split字符串和涉及数组操作,字符串函数可以原生处理。

    请注意,For Each 对于迭代对象集合是有效的。要迭代数组,请使用 For 循环以获得最佳性能[Source]

    此外,使用String 而不是Variant 可以避免隐式类型转换。因此,这应该更有效:

    Sub GetId()
        Dim linkList As Variant
        linkList = Array( _
            "https://etc.com/en/category/all/all/shops/206898", _
            "https://etc.com/ar/category/all/mobile/350689", _
            "https://etc.com/bn/category/all/bike/760689" _
            )
        Dim current As Long, link As String
        For current = LBound(linkList) To UBound(linkList)
            link = linkList(current)
            Debug.Print Mid$(link, InStrRev(link, "/") + 1)
        Next
    End Sub
    

    【讨论】:

    • 您的答案是我大多数时候更喜欢@Mathieu Guindon 的答案。我希望我能接受这两个答案。顺便说一句,去Split(StrReverse(link), "/")(0) 好吗?谢谢。
    • @robots.txt 如果您将其反转回来应该可以工作,但为什么呢?您现在正在链接两个反向和一个拆分,它们都必须分配和创建新字符串。我希望它的可读性和效率都会降低。在您的小规模上,效率可能无关紧要,但我仍然不推荐这条路线。
    【解决方案2】:
    Sub GetId()
        Dim linkId As Variant, linkList As Variant, v As Variant
    
        linkList = Array( _
            "https://etc.com/en/category/all/all/shops/206898", _
            "https://etc.com/ar/category/all/mobile/350689", _
            "https://etc.com/bn/category/all/bike/760689" _
            )
    
        For Each linkId In linkList
            v = Split(linkId, "/")
            Debug.Print v(UBound(v))
        Next linkId
    End Sub
    

    【讨论】:

    • 投票给你。这是永远不会想到的(许多)功能之一。
    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 2021-05-16
    • 2019-12-27
    • 2015-01-07
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多