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

时间:2016-02-19 01:41:25

标签: java

我正在尝试解析一个dat文件,而我正在努力解决Java中的分裂问题。我想我遗漏了一些基本的东西,但我不知道是什么,下面是我的两个班级和我的测试文件。我可以通过使用括号和管道来使用所有分隔符,但是我希望它能够一起处理::当它通过文本时它会将::视为一个分隔符。现在它将它视为两个实例:并在我的结果中给我一个黑色空间。

Driver.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;
    }

}

TEST.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

正如你从我的输出中看到的那样,它为名称留下了空白,并将结果的其余部分调低。

2 个答案:

答案 0 :(得分:2)

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

您真正想要的是在所有出现的双冒号和所有出现的管道时分割字符串。将其写成一个简单的正则表达式,得到split("::|\\|")

  • 双冒号(::)或(|)竖线(\\|
  • 因为管道是正则表达式中的保留字符,所以当你不希望它表示&#34;或&#34;
  • 时,你必须逃避这个角色。
  • 在Java正则表达式中转义,使用双反斜杠

答案 1 :(得分:0)

根据Java文档,split函数采用正则表达式字符串。使用以下应该可以正常工作 - 拆分(“:{2} | \ |”)。正则表达式的解释恰好匹配2个实例:和第一个反斜杠来转义反斜杠符号,第二个转义为|符号。 |中间的符号表示替代匹配。因此,当通过上面的正则表达式分割时,字符串“hello :: world | cool”会给你一个包含三个字符串的数组。