我的代码有问题。

我正在尝试从.txt文件中提取频道的名称。
我不明白为什么方法line.split()给我返回长度为0的数组:

有人可以帮我吗?

这是文件.txt:

------------ [channels.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);
}

最佳答案

tvg-name=\"中最后一个双引号后面有一个空格,该空格与示例中的数据不匹配。

当对line.split(" tvg-name=\"", 2)使用split时,返回数组中的第一项为#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);
}

关于java - Java .split()超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52693305/

10-09 21:02