【问题标题】:A simple string.split() gone horribly wrong [duplicate]一个简单的 string.split() 严重错误 [重复]
【发布时间】:2013-02-13 13:14:29
【问题描述】:

这段代码似乎坏了,但我不知道为什么:

System.out.println(line);
// prints: Some Name;1|IN03PLF;IN02SDI;IN03MAP;IN02SDA;IN01ARC

String args[]            = line.split("|");
String candidatArgs[]    = args[0].split(";");
String inscrieriString[] = args[1].split(";");


System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(candidatArgs);
System.out.println("[0]:" + candidatArgs[0]);
System.out.println("[1]:" + candidatArgs[1]);

// prints: S
//         [Ljava.lang.String;@4f77e2b6
//         [0]:

我不知道为什么会这样。按照我的逻辑:

String args[]            = line.split("|");
[0]: Some Name;1
[1]: IN02SDI;IN03MAP;IN02SDA;IN01ARC

代替:

[0]: S

如果您想要更多代码:即使它没有做太多也应该编译(尽可能多地删除不必要的代码)

主要:

有一个文件: Candidati.txt

包含: Some Name;1|IN03PLF;IN02SDI;IN03MAP;IN02SDA;IN01ARC

import java.util.ArrayList;

Repository repository = new Repository ("Candidati.txt"); // file name

    ArrayList<Candidat> candidati = repository.getCandidati();
    System.out.println(candidati);

存储库

import java.util.ArrayList;

public class Repository {

    private String fisierCuCandidati;

    private ArrayList<Candidat> listaCandidati;

    public Repository (String fisierCuCandidati) {

        this.fisierCuCandidati = fisierCuCandidati; // file name

        this.listaCandidati = new ArrayList<Candidat>();

        this.incarcaCandidati();
    }


    public void incarcaCandidati() {
        FileReader in = null;
        BufferedReader input = null;

        //try {


            in = new FileReader (this.fisierCuCandidati);
            input = new BufferedReader (in);

            String line;
            while ((line = input.readLine()) != null) {

                System.out.println(line);

                String args[]            = line.split("|");
                String candidatArgs[]    = args[0].split(";");
                String inscrieriString[] = args[1].split(";");


                System.out.println(args[0]);
                System.out.println(args[1]);
                System.out.println(candidatArgs);
                System.out.println("[0]:" + candidatArgs[0]);
                System.out.println("[1]:" + candidatArgs[1]);
            }


}

候选人

public class Candidat {

    public Candidat (String nume) {

    }

    public Candidat (String nume, int id) {

    }

【问题讨论】:

    标签: java string-split


    【解决方案1】:

    String.split使用正则表达式,所以需要转义管道|,这是一个特殊字符(意思是OR):

    String args[] = line.split("\\|");
    

    还要打印String 数组输出而不是Object.toString 表示,您将需要:

    System.out.println(Arrays.toString(candidatArgs));
    

    【讨论】:

      【解决方案2】:

      您要么需要转义pipe,要么在拆分的字符类中使用它,因为String#split 采用正则表达式,而| 是正则表达式中的元字符。所以,改用这个:

      String args[] = line.split("\\|");
      

      或:

      String args[] = line.split("[|]");
      

      字符类起作用的原因是,在字符类内部,元字符没有特殊含义。所以,管道只是一个管道,而不是一个交替字符。

      除此之外,您应该使用Arrays#toString 方法来打印您的数组。

      【讨论】:

        【解决方案3】:

        改为:

        String args[]            = line.split("\\|");
        

        你的| 不起作用,因为split 的参数是一个正则表达式,| 在正则表达式中有特殊含义(或)。

        【讨论】:

          【解决方案4】:

          | 是 java 正则表达式中的一个特殊字符,所以你需要像\\| 一样对其进行转义。我一般都会的

          line.split(Pattern.quote(separator))
          

          其中 Pattern 是http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html,并且 separator 是您使用的任何分隔符。这会自动处理转义特殊字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-24
            • 2011-07-15
            • 2017-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多