none
如何用正则表达式匹配网络图片 URI? RRS feed

  • 问题

  • 我自己写了一个,但用了几天发现有不能正确匹配的情况了:

    网络图片 URI 形式(就是普普通通的那种):

    http://xxxxxx/xxx/.../image.jpg

    我自己写的 正则表达式(由于匹配文本是 JSON 格式的,所以正则表达式做了转义):

    [a-zA-z]+:\\/\\/[^\s]*\\/[^\s]*.jpg

    但我发现对于下面的文本:

    {"title":"title1","images":["http:\/\/abc.com\/image1.jpg"],"id":13579},{"title":"title2","images":["http:\/\/abc.com\/image2.jpg"],"id":246810}

    匹配结果是:

    共找到 1 处匹配:
    http:\/\/abc.com\/image1.jpg"],"id":13579},{"title":"title2","images":["http:\/\/abc.com\/image2.jpg
    问题所在:匹配将把 http://.......jpg.......jpg 当作一个 URI,也就是说只管开头和结尾来匹配。


    2015年11月7日 13:38

答案

  • 你好,

    看起来是你正则表达式的最后一部分导致了这个问题。 [^\s]*.jpg 它会匹配到最后一个jpg。 我们可以对image 的名字加限制, 如:[^\s , \}]


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月10日 2:28
  • 谢谢,我已经通过 MSDN 示例了解了下正则表达式,一点点写终于写出来了:

    ((http):\\/\\/(([^\\/]+)([\\/(\w+)^\\/]+?))(\\/((\w+)\.(jpg)))
    http:\\/\\/[^\s\\/]+([\\/\w+^\\/]+)\\/([^\s]+?\.jpg)
    http:\\/\\/([^\s\\/]+)(\\/[^\s]+?\.jpg)
    http:\\/\\/([^\s]+?\\/)([^\s]+?\.jpg)

    上面从上到下是我一点点改进的,虽然不完美,(其实我希望能匹配 URI 的各个部分:协议://域名/等),但上面写的还有些问题,不过最重要的是能匹配 URI 末尾的图片名称了。

    ================↓分割线↓(更新于2015年11月16日)===================

    最新的改良版:

    http:\\/\\/[^{\[,"\]}]+\\/([\w]+?\.jpg)

    再次提醒:这是适用于匹配 JSON 文本中的 JPG 图片URI 的正则表达式(所以做了转义“\”→“\\”)。

    另外,将这表达式写入 C# 语言中,还需要再次转义,为了使语句清晰,我建议写成下面这样:

    @"http:\\/\\/[^{\[,\" + "\"" + @"\]}]+?\\/([\w]+?\.jpg)"

    2015年11月10日 10:23

全部回复

  • 你好,

    看起来是你正则表达式的最后一部分导致了这个问题。 [^\s]*.jpg 它会匹配到最后一个jpg。 我们可以对image 的名字加限制, 如:[^\s , \}]


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月10日 2:28
  • 谢谢,我已经通过 MSDN 示例了解了下正则表达式,一点点写终于写出来了:

    ((http):\\/\\/(([^\\/]+)([\\/(\w+)^\\/]+?))(\\/((\w+)\.(jpg)))
    http:\\/\\/[^\s\\/]+([\\/\w+^\\/]+)\\/([^\s]+?\.jpg)
    http:\\/\\/([^\s\\/]+)(\\/[^\s]+?\.jpg)
    http:\\/\\/([^\s]+?\\/)([^\s]+?\.jpg)

    上面从上到下是我一点点改进的,虽然不完美,(其实我希望能匹配 URI 的各个部分:协议://域名/等),但上面写的还有些问题,不过最重要的是能匹配 URI 末尾的图片名称了。

    ================↓分割线↓(更新于2015年11月16日)===================

    最新的改良版:

    http:\\/\\/[^{\[,"\]}]+\\/([\w]+?\.jpg)

    再次提醒:这是适用于匹配 JSON 文本中的 JPG 图片URI 的正则表达式(所以做了转义“\”→“\\”)。

    另外,将这表达式写入 C# 语言中,还需要再次转义,为了使语句清晰,我建议写成下面这样:

    @"http:\\/\\/[^{\[,\" + "\"" + @"\]}]+?\\/([\w]+?\.jpg)"

    2015年11月10日 10:23