java - 如何使用 "::"作为与其他分隔符的分隔符

标签 java

我正在尝试解析一个 dat 文件,但我正在努力解决 Java 中的分割问题。我想我错过了一些基本的东西,但我不知道是什么,下面是我的两个类(class)和我的测试文件。我可以通过使用括号和管道让它使用所有分隔符,但我希望它将::一起处理,这样当它遍历文本时,它将::作为一个分隔符。现在它把它当作 : 的两个实例,并在结果中给我一个黑色空格。

驱动程序.java

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

public class Driver
{

    public static void main(String[] args) throws IOException {
        List<MovieInfo> mData = new ArrayList<>();

        File rData = new File("test.dat");

        Scanner scanner = new Scanner(rData);

        while (scanner.hasNext())
        {
            String[] data = scanner.nextLine().split("[::|(|)]"); //this is where my issue is

            String tempId = data[0];
            String tempName = data[1];
            String tempYear = data[2];
            String tempGenres = data[3];

            MovieInfo tempMInfo = new MovieInfo(tempId, tempName, tempYear, tempGenres);

            mData.add(tempMInfo);
        }

        for (MovieInfo each:mData)

        System.out.println(each);
        System.out.println("done");
    }
}

MovieInfo.java

public class MovieInfo {
    private String id;
    private String name;
    private String year;
    private String genres;

    public MovieInfo(String id, String name, String year, String genres)
    {
        this.id = id;
        this.name = name;
        this.year = year;
        this.genres = genres;
    }

    public String toString()
    {
        return "ID #: " + id + "\n" + "Name: " + name + "\n" + "Year: " + year + "\n" + "Genres: " + genres;
    }

}

测试.dat

1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
6::Heat (1995)::Action|Crime|Thriller
7::Sabrina (1995)::Comedy|Romance
8::Tom and Huck (1995)::Adventure|Children's
9::Sudden Death (1995)::Action
10::GoldenEye (1995)::Action|Adventure|Thriller

输出

ID #: 1
Name: 
Year: Toy Story 
Genres: 1995
ID #: 2
Name: 
Year: Jumanji 
Genres: 1995
ID #: 3
Name: 
Year: Grumpier Old Men 
Genres: 1995
ID #: 4
Name: 
Year: Waiting to Exhale 
Genres: 1995
ID #: 5
Name: 
Year: Father of the Bride Part II 
Genres: 1995
ID #: 6
Name: 
Year: Heat 
Genres: 1995
ID #: 7
Name: 
Year: Sabrina 
Genres: 1995
ID #: 8
Name: 
Year: Tom and Huck 
Genres: 1995
ID #: 9
Name: 
Year: Sudden Death 
Genres: 1995
ID #: 10
Name: 
Year: GoldenEye 
Genres: 1995
done

正如您从我的输出中看到的,它在名称处留了一个空白,并将其余结果下移。

最佳答案

它忽略您版本中的双冒号的原因是您正在使用方括号创建一个字符类。字符类中的重复字符将被忽略。您的正则表达式还将导致它将 () 视为分隔符,因为它们也包含在类中。

实际上,您似乎想要在所有出现双冒号和所有出现管道的地方拆分字符串。将其写为简单的正则表达式,您将得到 split("::|\\|")

  • 双冒号 (::) 或 (|) 管道 (\\|)
  • 由于管道是正则表达式中的保留字符,因此当您不希望它表示“或”时,必须转义该字符
  • 要在 Java 正则表达式中转义,请使用双反斜杠

关于java - 如何使用 "::"作为与其他分隔符的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495838/

相关文章:

java - 从 spring-boot :run 获取命令行参数

java - 用于反射的泛型类型声明

java - 为什么 teradata faSTLoad 这么慢?

java - @SpringBootApplication 和@ComponentScan 不能一起工作(bean 配置)

java - 具有泛型类型的 Mockito 和 RestTemplate

java - 使用 Appium 脚本自动化 android 模拟器和浏览器

ruby-on-rails - 错误 : cannot start RubyMine. 未找到 JDK。 JDK版本? + 桌面链接

java - 用于关闭 JDialog 的按钮

java - 如何使 JPanel 适合 JTabbedPane 大小?

java - 如何从 Eclipse ColorRegistry 中删除条目?