我正在尝试解析一个 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/