【问题标题】:REGEX: Extract latitude and longitude from Google Maps URL正则表达式:从谷歌地图 URL 中提取纬度和经度
【发布时间】:2020-07-28 01:05:42
【问题描述】:

如何从这个字符串中提取第二个纬度和经度? (经纬度是!3d(-15.7202756)和!4d(-47.8857498)之后的数字

https://www.google.com.br/maps/place/Abbraccio+Cucina+Italiana/@-15.7202756,-47.9207687,13z/data=!4m9!1m3!2m2!1srestaurants+in+Bras%C3%ADlia+-+Brasilia,+Federal+District!6e5!3m4!1s0x935a39a1395ec361:0x5c869291493e902c!8m2!3d-15.7202756!4d-47.8857498

(-?[\d]*\.[\d]*),(-[\d]*\.[\d]*) 提取第一个值但是,我需要第二个纬度和经度值。

【问题讨论】:

  • 您使用什么语言/工具?来自regex tag info:“由于正则表达式尚未完全标准化,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。”

标签: regex


【解决方案1】:

您也可以只拆分 URL,而不是正则表达式:

lat, long = url.split("!3d")[1].split("!4d");

lat # '-15.7202756'
long # '-47.8857498'

(这是 Python,但在其他语言中会类似)

【讨论】:

    【解决方案2】:

    你可能会使用

    !3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+))
    

    要匹配 1+ 个数字,您可以使用 + 而不是 *,否则单个点也会匹配。

    • !3d 字面匹配
    • (-?\d+(?:\.\d+)?) 匹配可选的- 数字和可选的小数部分
    • !4d 字面匹配
    • (-?\d+(?:\.\d+)) 匹配可选的- 数字和可选的小数部分

    Regex demo


    您也可以使用parse_url,获取路径,在/ 上拆分并获取最后一部分并在捕获组1 中获取以!3d!4d 开头的值和2.

    $str = "https://www.google.com.br/maps/place/Abbraccio+Cucina+Italiana/@-15.7202756,-47.9207687,13z/data=!4m9!1m3!2m2!1srestaurants+in+Bras%C3%ADlia+-+Brasilia,+Federal+District!6e5!3m4!1s0x935a39a1395ec361:0x5c869291493e902c!8m2!3d-15.7202756!4d-47.8857498";
    
    $parts = explode('/', parse_url($str)["path"]);
    $lastPart = end($parts);
    preg_match("~!3d(-?\d+(?:\.\d+)?)!4d(-?\d+(?:\.\d+))~", $lastPart, $matches);
    print_r($matches);
    

    输出

    Array
    (
        [0] => !3d-15.7202756!4d-47.8857498
        [1] => -15.7202756
        [2] => -47.8857498
    )
    

    【讨论】:

      【解决方案3】:

      我们可以看到纬度/经度是精度为 9 和比例为 7 的数字。

      您可以使用以下正则表达式:

      (\W?[0-9]{2}\.[0-9]{7}).{3}(\W?[0-9]{2}\.[0-9]{7})$
      

      它使用$ 运算符从字符串末尾抓取。分为两个捕获组(\W?[0-9]{2}\.[0-9]{7}),它们捕获精度为 9 和小数位数为 7 的数字,即 89.1234567,带有可选的非字母数字(即开头的“-”)

      我们可以看到它们被 3 位数除,所以我们可以在它们之间做.{3}。如果您有更多或更少数字的案例,您可以使用.{1,x},其中 x 是一个足够小的数字,而不是正则表达式从上面的纬度/经度获取。

      如果您确定他们会遵循您上面提到的规则,即他们会遵循 !3d 和 !4d 您可以使用以下正则表达式来匹配组:

      !3d(\W?[0-9]{2}\.[0-9]{7})!4d(\W?[0-9]{2}\.[0-9]{7})$
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        相关资源
        最近更新 更多