我的代码有问题。
我正在尝试从.txt文件中提取频道的名称。我不明白为什么line.split()
方法返回给我一个长度为0的数组:
有人能帮我吗?
这是文件.txt:
...
#CH id="" tvg-name="Example1" tvg-logo="http...
#CH id="" tvg-name="Example2" tvg-logo="http...
#CH id="" tvg-name="Example3" tvg-logo="http...
#CH id="" tvg-name="Example4" tvg-logo="http...
...
这是我的代码:
try {
FileInputStream VOD = new FileInputStream("channels.txt");
BufferedReader buffer_r = new BufferedReader(new InputStreamReader(VOD));
String line;
ArrayList<String> name_channels = new ArrayList<String>();
while ((line = buffer_r.readLine()) != null ) {
if (line.startsWith("#")) {
String[] first_scan = line.split(" tvg-name=\" ", 2);
String first = first_scan[1]; // <--- out of bounds
String[] second_scan = first.split(" \"tvg-logo= ", 2);
String second = second_scan[0];
name_channels.add(second);
} else {
//...
}
}
for (int i = 0; i < name_channels.size(); i++) {
System.out.println("Channel: " + name_channels.get(i));
}
} catch(Exception e) {
System.out.println(e);
}
发布于 2018-10-08 15:33:46
在tvg-name=\"
中的最后一个双引号之后有一个空格,它与示例中的数据不匹配。
将split与line.split(" tvg-name=\"", 2)
一起使用时,返回的数组中的第一项将为#CH id=""
,第二部分将为Example1" tvg-logo="http..."
如果想要获取tvg-name=
的值,可以使用带有捕获组的正则表达式,在捕获组中,您将使用一个被取反的字符类[^"]+
来捕获双引号
tvg-name="([^"]+)"
try {
FileInputStream VOD = new FileInputStream("channels.txt");
BufferedReader buffer_r = new BufferedReader(new InputStreamReader(VOD));
String line;
ArrayList<String> name_channels = new ArrayList<String>();
while((line = buffer_r.readLine()) != null ){
if(line.startsWith("#")){
String regex = "tvg-name=\"([^\"]+)\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
name_channels.add(matcher.group(1));
}
} else {
// ...
}
}
for(int i = 0; i < name_channels.size(); i++){
System.out.println("Channel: " + name_channels.get(i));
}
}catch(Exception e){
System.out.println(e);
}
发布于 2018-10-08 07:28:56
所以你有像这样的例子
#CH id="" tvg-name="Example1" tvg-logo="http...
并试图对这些字符串进行拆分
" tvg-name=\" "
" \"tvg-logo= "
这两个字符串都不在示例中。添加了一个虚假的空格,并且第二个空格的开头位置错误。
修复字符串,下面是一个简洁但完整的程序来演示
interface Split {
static void main(String[] args) {
String line = "#CH id=\"\" tvg-name=\"Example1\" tvg-logo=\"http...";
String[] first_scan = line.split(" tvg-name=\"", 2);
String first = first_scan[1]; // <--- out of bounds
String[] second_scan = first.split("\" tvg-logo=", 2);
String second = second_scan[0];
System.err.println(second);
}
}
当然,如果您有任何以'#'
开头但不匹配的行,您将遇到类似的问题。
使用正则表达式和捕获组可能会更好地完成这类工作。
https://stackoverflow.com/questions/52693305
复制相似问题