我在找到正确的正则表达式时遇到了一些问题。
源代码如下所示:
\"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+\\":\\"(.*?)\\"
但它没有用。
答案 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}}
正如我们所看到的,模式字符串的值一旦取消转义就是我们想要的正则表达式。