我真正想要的是返回txt变量中的URL。网址来自随机然后不是常规expreccion使用或不是我的代码这部分写得不好...使用谷歌翻译只对不起我说西班牙语;醇
//I can't get the url with Pattern.compile
//My code example::::: in the works :(
String txt="sources: [{file:\"http://pla.cdn19.fx.rrrrrr.com/luq5t4nidtixexzw6wblbiexs7hg2hdu4coqdlltx6t3hu3knqhbfoxp7jna/normal.mp4\",label:\"360p\"}],sources: [{file:\"http://pla.cdn19.fx.rrrrrr.com/luq5t4nidtixexzw6wblbiexs7hg2hdu4coqdlltx6t3hu3knqhbfoxp7jna/normal.mp4\",label:\"360p\"}]";
ArrayList<String> getfi = new ArrayList<String>();
Matcher matcher = Pattern.compile("sources: [{file:\"(.*)\"").matcher(txt);
if (matcher.find()) {
while(matcher.find()) {
getfi.add(matcher.group(1));
}
System.out.println(getfi);
} else {
System.exit(1);
}
答案 0 :(得分:1)
mysql_*
你的正则表达式是错误的,因为Pattern.compile("sources: [{file:\"(.*)\"")
和[
都是特殊字符,所以必须对它们进行转义。这就是为什么你得到{
,这是你在问题中没有提到的。
此外,模式将匹配整个字符串,但最后两个字符除外。
PatternSyntaxException: Unclosed character class near index 21
if (matcher.find()) {
while(matcher.find()) {
语句中的find()
调用会消耗第一个查找。由于第一个查找是除最后两个字符之外的整个文本,因此if
循环中find()
调用没有第二个查找,因此永远不会输入循环。
要使其正常工作,请转义特殊字符,将while
更改为不贪婪,然后修复循环:
.*
警告:强>
请注意,有时String txt="sources: [{file:\"http://pla.cdn19.fx.rrrrrr.com/luq5t4nidtixexzw6wblbiexs7hg2hdu4coqdlltx6t3hu3knqhbfoxp7jna/normal.mp4\",label:\"360p\"}],sources: [{file:\"http://pla.cdn19.fx.rrrrrr.com/luq5t4nidtixexzw6wblbiexs7hg2hdu4coqdlltx6t3hu3knqhbfoxp7jna/normal.mp4\",label:\"360p\"}]";
Matcher matcher = Pattern.compile("sources: \\[\\{file:\"(.*?)\"").matcher(txt);
ArrayList<String> getfi = new ArrayList<String>();
while (matcher.find()) {
getfi.add(matcher.group(1));
}
if (getfi.isEmpty()) {
System.exit(1);
}
System.out.println(getfi);
之后会有一个空格,有时则不会。这对JSON完全有效。 JSON文本可能包含空格,包括换行符,因此使用简单的正则表达式不是一个好主意。
改为使用JSON解析器。