首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java .split()越界

Java .split()越界
EN

Stack Overflow用户
提问于 2018-10-08 06:02:56
回答 2查看 82关注 0票数 0

我的代码有问题。

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

有人能帮我吗?

这是文件.txt:

代码语言:javascript
复制
...
#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...
...

这是我的代码:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-08 15:33:46

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

将split与line.split(" tvg-name=\"", 2)一起使用时,返回的数组中的第一项将为#CH id="",第二部分将为Example1" tvg-logo="http..."

如果想要获取tvg-name=的值,可以使用带有捕获组的正则表达式,在捕获组中,您将使用一个被取反的字符类[^"]+来捕获双引号

tvg-name="([^"]+)"

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-08 07:28:56

所以你有像这样的例子

代码语言:javascript
复制
#CH id="" tvg-name="Example1" tvg-logo="http... 

并试图对这些字符串进行拆分

代码语言:javascript
复制
" tvg-name=\" "
" \"tvg-logo= "

这两个字符串都不在示例中。添加了一个虚假的空格,并且第二个空格的开头位置错误。

修复字符串,下面是一个简洁但完整的程序来演示

代码语言:javascript
复制
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);
    } 
}

当然,如果您有任何以'#'开头但不匹配的行,您将遇到类似的问题。

使用正则表达式和捕获组可能会更好地完成这类工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52693305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档