0

我正在尝试从以下 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,所以请帮助我,让我了解这种方法。谢谢你

4

3 回答 3

0

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

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
于 2013-03-09T14:21:36.490 回答
0

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

int startIndex = s.indexOf("rb\\/") + 4;
int endIndex = s.indexOf('\'', startIndex);
String image = s.substring(startIndex, endIndex);
于 2013-03-09T14:22:10.843 回答
0

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

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

在这里你可以找到一个演示

于 2013-03-09T14:56:17.290 回答