【问题标题】:Java RegExp to get variable image name with its extension from javascriptJava RegEx 从 javascript 获取带有扩展名的变量图像名称
【发布时间】:2013-03-09 14:14:57
【问题描述】:

我正在尝试从以下 javascript 中获取图像名称。

var g_prefetch ={'Im': {url:'\/az\/hprichbg\/rb\/WhiteTippedRose_ROW10477559674_1366x768.jpg', hash:'674'}

问题:

图像的名称是可变的。也就是说,在上面的示例代码中,图像会定期变化。

我想要的输出:

WhiteTippedRose_ROW10477559674_1366x768.jpg

我尝试了以下正则表达式:

Pattern p = Pattern.compile("\{\'Im\'\: \{url\:\'\\\/az\\\/hprichbg\\\/rb\\\/(.*?)\.jpg\'\, hash\:\'674\'\}");
                    //System.out.println(p);
                    Matcher m=p.matcher(out);
                        if(m.find())                            {
                            System.out.println(m.group());

                            }

我不太了解 RegExp,所以请帮助我,让我了解这种方法。 谢谢你

【问题讨论】:

  • ...或者您可以使用 json 解析器...
  • @radai 你能指导我使用java中的json解析器吗?谢谢你的快速回复
  • @radai:这是我首先想到的,但这不是 JSON。
  • @JBNizet - 你确定吗?也许OP只是省略了一个右括号? @BOSS——假设这确实是json,看看这个问题——stackoverflow.com/questions/13796045/…
  • 应该可以使用简单的正则表达式,例如 [^\/]*.jpg。

标签: java regex


【解决方案1】:

我会使用以下正则表达式,它应该足够快:

Pattern p = Pattern.compile("[^/]+\\.jpg");
Matcher m = p.matcher(str);
if (m.find()) {
  String match = m.group();
  System.out.println(match);
}

这将匹配以 .jpg 结尾的完整字符序列,不包括 /

我认为正确的方法是检查文件名的正确合法性。

以下是 Windows 的非法字符列表:"\\/:*?\"<>|" 对于 Mac /: Linux/Unix/;

这是一个更复杂的例子,假设格式会改变,它主要是为合法的窗口文件名设计的:

String s = "{'Im': {url:'\\/az\\/hprichbg\\/rb\\/?*<>WhiteTippedRose_ROW10477559674_1366x768.jpg', hash:'674'}";

Pattern p = Pattern.compile("[^\\/:*?\"<>|]+\\.jpg");
Matcher m = p.matcher(s);
if (m.find()) {
  String match = m.group();
  System.out.println(match);
}

这仍然会打印 WhiteTippedRose_ROW10477559674_1366x768.jpg

您可以在这里找到demo

【讨论】:

    【解决方案2】:

    假设图像始终放在/ 之后并且不包含任何/,您可以使用以下内容:

    String s = "{'Im': {url:'\\/az\\/hprichbg\\/rb\\/WhiteTippedRose_ROW10477559674_1366x768.jpg', hash:'674'}";
    s = s.replaceAll(".*?([^/]*?\\.jpg).*", "$1");
    System.out.println("s = " + s);
    

    输出:

    s = WhiteTippedRose_ROW10477559674_1366x768.jpg

    实质上:

    .*?             skip the beginning of the string until the next pattern is found
    ([^/]*?\\.jpg)  a group like "xxx.jpg" where xxx does not contain any "/"
    .*              rest of the string
    $1              returns the content of the group
    

    【讨论】:

      【解决方案3】:

      如果字符串总是这种形式,我会这样做:

      int startIndex = s.indexOf("rb\\/") + 4;
      int endIndex = s.indexOf('\'', startIndex);
      String image = s.substring(startIndex, endIndex);
      

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2011-09-14
        相关资源
        最近更新 更多