我正在尝试解析一个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
正如你从我的输出中看到的那样,它为名称留下了空白,并将结果的其余部分调低。
答案 0 :(得分:2)
它忽略你的版本中的双冒号的原因是你通过使用括号来创建一个字符类。忽略字符类中的重复字符。您的正则表达式也会导致它将(
和)
视为分隔符,因为它们也包含在类中。
您真正想要的是在所有出现的双冒号和所有出现的管道时分割字符串。将其写成一个简单的正则表达式,得到split("::|\\|")
::
)或(|
)竖线(\\|
)答案 1 :(得分:0)
根据Java文档,split函数采用正则表达式字符串。使用以下应该可以正常工作 - 拆分(“:{2} | \ |”)。正则表达式的解释恰好匹配2个实例:和第一个反斜杠来转义反斜杠符号,第二个转义为|符号。 |中间的符号表示替代匹配。因此,当通过上面的正则表达式分割时,字符串“hello :: world | cool”会给你一个包含三个字符串的数组。