gpt4 book ai didi

谷歌地图 url 的 Java 正则表达式?

转载 作者:行者123 更新时间:2023-12-02 02:56:24 27 4
gpt4 key购买 nike

我想解析字符串中的所有谷歌地图链接。格式如下:

第一个例子https://www.google.com/maps/place/white+house/@38.8976763,-77.0387185,17z/data=!3m1!4b1!4m5!3m4!1s0x89b7b7bcdecbb1df:0x715969d86d0b76bf!8m2!3d38.8976763! 4d-77.0365298

https://www.google.com/maps/place/white+house/@38.8976763,-77.0387185,17z

https://www.google.com/maps/place//@38.8976763,-77.0387185,17z

https://maps.google.com/maps/place//@38.8976763,-77.0387185,17z

https://www.google.com/maps/place/@38.8976763,-77.0387185,17z

https://google.com/maps/place/@38.8976763,-77.0387185,17z

http://google.com/maps/place/@38.8976763,-77.0387185,17z

https://www.google.com.tw/maps/place/@38.8976763,-77.0387185,17z

这些都是有效的谷歌地图网址(链接到白宫)

这是我尝试过的

String gmapLinkRegex = "(http|https)://(www\\.)?google\\.com(\\.\\w*)?/maps/(place/.*)?@(.*z)[^ ]*";
Pattern patternGmapLink = Pattern.compile(gmapLinkRegex , Pattern.CASE_INSENSITIVE);
Matcher m = patternGmapLink.matcher(s);
while (m.find()) {
logger.info("group0 = {}" , m.group(0));
String place = m.group(4);
place = StringUtils.stripEnd(place , "/"); // remove tailing '/'
place = StringUtils.stripStart(place , "place/"); // remove header 'place/'
logger.info("place = '{}'" , place);
String latLngZ = m.group(5);
logger.info("latLngZ = '{}'" , latLngZ);
}

它可以在简单的情况下工作,但仍然有问题......例如

需要后期处理来获取可选的地点信息

并且它无法提取具有两个网址的一行,例如:

s = "https://www.google.com/maps/place//@38.8976763,-77.0387185,17z " +
" and http://google.com/maps/place/@38.8976763,-77.0387185,17z";

它应该是两个网址,但正则表达式匹配整行...

要点:

  • 整个 URL 应在 group(0) 中匹配(包括第一个示例中的尾部 data 部分),
  • 在第一个示例中,如果缩放级别:17z 被删除,它仍然是有效的 gmap URL,但我的正则表达式无法匹配它。
  • 更容易提取可选的地点信息
  • 纬度/经度提取是必须的,缩放级别是可选的。
  • 能够在一行中解析多个网址
  • 能够处理 maps.google.com(.xx)/maps ,我尝试过 (www|maps\.)? 但似乎仍然有问题

有什么改进这个正则表达式的建议吗?非常感谢!

最佳答案

点星号

.*

始终允许最后一个 url 末尾的任何内容。您需要“更严格”的正则表达式,它匹配单个 URL,但不匹配多个 URL。如果“[^]*”被“”以外的其他内容分隔,则可能包含下一个 URL,其中包括换行符、制表符、移位空格...

我建议(抱歉,没有在java上测试过),使用“除@之外的任何内容”和“数字、减号、逗号或点”和“可选的特殊字符串,后跟定制的字符集,多次”。

"(http|https)://(www\.)?google\.com(\.\w*)?/maps/(place/[^@]*)?@([0123456789\.,-]*z)(\/data=[\!:\.\-0123456789abcdefmsx]+)?"

我在 perl-regex 兼容引擎 (np++) 上测试了上面的内容。
如果我猜错了,请自行调整。显式的数字列表可能可以用“\d”替换,我试图尽量减少对正则表达式风格的假设。

为了匹配“URL”或“URL 和 URL”,请使用存储正则表达式的变量,然后执行“(URL 和 )*URL”,将“URL”替换为正则表达式变量。 (假设这在java中是可能的。)如果问题是如何检索多个匹配项:那就是java,我无能为力。让我知道,我会删除这个答案,而不是激起应有的反对票;-)

(已编辑以捕获之前未见过的第一个示例第一行中的数据部分;以及一行中的多个 URL。)

关于谷歌地图 url 的 Java 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43005917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com