Java 我如何使用“:”:&引用;作为分隔符与其他分隔符

Java 我如何使用“:”:&引用;作为分隔符与其他分隔符,java,Java,我正在尝试解析一个dat文件,我正在用Java进行拆分。我想我遗漏了一些基本的东西,但我不知道是什么,下面是我的两个类和我的测试文件。我可以通过使用括号和管道让它使用所有的分隔符,但我希望它将::处理在一起,这样当它遍历文本时,它将::作为一个分隔符处理。现在它把它当作两个例子:在我的结果中给我一个空格 Driver.java import java.io.File; import java.io.IOException; import java.util.Scanner; import jav

我正在尝试解析一个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");
    }
}
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

正如您从我的输出中看到的,它将名称留空,并向下移动其余结果。

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

实际上,您似乎希望在双冒号的所有引用处和管道的所有引用处拆分字符串。将其作为一个简单的正则表达式编写,可以得到
split(“::\ \ \ \ \ \”)

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

根据Java文档,split函数采用正则表达式字符串。使用以下命令应该可以精细拆分(“:{2}\\\\”)。正则表达式的解释正好匹配两个实例:第一个反斜杠用于转义反斜杠符号,第二个用于转义|符号中间符号表示交替匹配。因此,字符串“hello::world | cool”在被上述正则表达式拆分时,应该会得到一个由三个字符串组成的数组

我也想使用(和)作为分隔符,但您的解释解决了我的问题,我最终使用了(“::\(\)\ \ \ \”)
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