JSON格式的URL列表的Java Regex模式

时间:2015-02-18 01:51:48

标签: java android regex

我在找到正确的正则表达式时遇到了一些问题。

源代码如下所示:

\"url240\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.240.mp4?extra=hash\"
,\"url360\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.360.mp4?extra=hash\"
,\"url480\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.480.mp4?extra=hash\"
,\"url720\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.720.mp4?extra=hash\"

我需要匹配所有网址(可以是一个,两个,三个或全部四个,这取决于提供给应用程序的源代码)并将它们存储在ArrayList中。

这是我通常使用的代码:

List<String> sourceList = new ArrayList<String>();
Pattern vPattern = Pattern.compile(?);
Matcher videoMatcher = vPattern.matcher(source);
while (videoMatcher.find())
    sourceList.add(videoMatcher.group(2));

但我通常使用的模式无法在这种情况下使用。

我尝试过:

\\"url\d+\\":\\"(.*?)\\"

但它没有用。

1 个答案:

答案 0 :(得分:0)

对于您列出的来源,您的表达是正确的。问题与字符串转义有关。

在Java中使用表达式时,我们在使用它之前将字符串解析两次,首先在创建Java字符串时再由正则表达式引擎创建,您所匹配的是\"url[0-9]+\":\"(.*?)\",您已经完成了第一级转义(对于正则表达式引擎)。接下来,我们需要再次为Java转义字符串。

因此,为了获得您发布的表达式,我们需要转义所有\,以便它们在最终字符串中变为\,并且不会被Java处理为转义序列,并且我们需要转义",因为整个事情是一个字符串,未转义"终止字符串。

这意味着我们需要为所有\"添加前缀\,只要我们更换,就可以使用搜索和替换在任何编辑器中轻松完成我\ \\ " \" \ "因为我们不想逃避"\\\\\"url\\d+\\\\\":\\\\\"(.*?)\\\\\""的{​​{1}}。{ / p>

这给了我们:videoMatcher.group(1)

除此之外,表达式只有一个匹配的组,因此我们需要videoMatcher.group(2)而不是public static void main(String[] args) throws Exception { String source = "\\\"url240\\\":\\\"https:\\\\\\/\\\\\\/domain.com\\\\\\/id123456\\\\\\/files\\\\\\/video.240.mp4?extra=hash\\\",\n\\\"url360\\\":\\\"https:\\\\\\/\\\\\\/domain.com\\\\\\/id123456\\\\\\/files\\\\\\/video.360.mp4?extra=hash\\\",\n\\\"url480\\\":\\\"https:\\\\\\/\\\\\\/domain.com\\\\\\/id123456\\\\\\/files\\\\\\/video.480.mp4?extra=hash\\\",\n\\\"url720\\\":\\\"https:\\\\\\/\\\\\\/domain.com\\\\\\/id123456\\\\\\/files\\\\\\/video.720.mp4?extra=hash\\\""; String pattern = "\\\\\"url\\d+\\\\\":\\\\\"(.*?)\\\\\""; System.out.println("Source: " + source); System.out.println("\nPattern: " + pattern); List<String> sourceList = new ArrayList<String>(); Pattern vPattern = Pattern.compile(pattern); Matcher videoMatcher = vPattern.matcher(source); while (videoMatcher.find()) { sourceList.add(videoMatcher.group(1)); } System.out.println("\nResult:" + Arrays.toString(sourceList.toArray(new String[0]))); }

<强>测试码:

Source: \"url240\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.240.mp4?extra=hash\",
\"url360\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.360.mp4?extra=hash\",
\"url480\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.480.mp4?extra=hash\",
\"url720\":\"https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.720.mp4?extra=hash\"

Pattern: \\"url\d+\\":\\"(.*?)\\"

Result:[https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.240.mp4?extra=hash, https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.360.mp4?extra=hash, https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.480.mp4?extra=hash,     https:\\\/\\\/domain.com\\\/id123456\\\/files\\\/video.720.mp4?extra=hash]

<强>输出:

{{1}}

正如我们所看到的,模式字符串的值一旦取消转义就是我们想要的正则表达式。