多个.replace给出NoSuchElementException

时间:2013-03-24 22:08:02

标签: java parsing

修改 整个方法是:

        public static String[] singlemultiplet(String filename, int numofzeros) throws IOException {//isolate notes between brackets
    Scanner inputmeasure = new Scanner(new DataInputStream(new FileInputStream(filename)));
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
            BufferedReader bReader = new BufferedReader(new InputStreamReader(is));
            StringBuffer sbfFileContents = new StringBuffer();
            String line = null;
            int lineCount = 0;
    int j = 0;
        int[] cmn = new int[countbrackets(filename)];
        String[] numbers = new String[40];
        String[][] matrix = new String[20][120];
        String[][] matrix2 = new String[20][120];
        String[][] matrix3 = new String[20][120];
            line = inputmeasure.useDelimiter("\n").next();
            Scanner s = new Scanner(line).useDelimiter("U");
            matrix[0][0] = s.useDelimiter("\r").next();
            String ubar = "U|";
            matrix2[0][0] = matrix[0][0].replace("\\),","U").replaceAll("\\)","U").replace(ubar,"U");
            matrix3[0][0] = matrix2[0][0].replace("|","U");
            Scanner s2 = new Scanner(matrix3[0][0]).useDelimiter("U");
            String brack = "(";
            String[] multiplet = new String[countmultipletsandmeasures(filename) + numofzeros];
            String[] multiplet2 = new String[countmultipletsandmeasures(filename) + numofzeros];
            Arrays.fill(multiplet, "");
            int cmampluszeros = countmultipletsandmeasures(filename) + numofzeros;
             for (int i = 0; i < cmampluszeros; i++)
             {
              matrix3[0][0] = s2.useDelimiter("U").next();
              multiplet[i] = matrix3[0][0];

             }
             lineCount++;
                    sbfFileContents.append(line);

            String strContent = sbfFileContents.toString();
    try {
        return multiplet;
    } finally {
        is.close();
    }
}

我想实现该方法返回包含要读入的multiplet行的块的数组Matrix3[0]。该方法必须按如下所述对行进行分块,因此遇到&#34时;),&#34;或&#34; |&#34;。

当我尝试阅读Matrix3[0]的第一行:

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|

该程序提供了块

multiplet[i]

as

multiplet: (A#,A#,A#
multiplet: ,(B#,B#,C#
multiplet: ,(B#,B#,C#
multiplet: ,(Bb,Bb,Cb
multiplet: (Ab,Ab,Ab
multiplet: ,(Bb,Bb,Cb
multiplet: ,(Bb,Bb,Cb
multiplet: ,(Bb,Bb,Cb

这是正确的。但是当我尝试阅读时: (A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#, | ,A, , , , , , , , , , , , , , |我得到NoSuchElementException。正确的输出是:

multiplet: (A#,A#,A#
multiplet: ,(B#,B#,C#
multiplet: ,(B#,B#,C#
multiplet: ,(Bb,Bb,Cb
multiplet: A#,B#,C#,D#, E#,F#,G#,  
multiplet:   ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  

有人知道为什么以及我应该做些什么来获得正确的输出?

修改

调试会给我以下stacktrace:

断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,770 bci = 322   2,770 multiplet [i] = matrix3 [0] [0];

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,767 bci = 333   2,767 for(int i = 0; i&lt; cmampluszeros; i ++)

主要[1]步骤

  

完成步骤:   断点命中:&#34; thread = main&#34;,IOguitar.singlemultiplet(),line = 2,769 bci = 306   2,769 matrix3 [0] [0] = s2.useDelimiter(&#34; U&#34;)。next();

主要[1]步骤

  

完成步骤:&#34; thread = main&#34;,IOguitar.main(),line = 2,662 bci = 35,573   2,662 e.printStackTrace();

主要[1]步骤

  

java.util.NoSuchElementException       at java.util.Scanner.throwFor(Scanner.java:838)       在java.util.Scanner.next(Scanner.java:1347)       在IOguitar.singlemultiplet(IOguitar.java:2769)       在IOguitar.countmultipletn(IOguitar.java:3121)       在IOguitar.main(IOguitar.java:187)

完成步骤:&#34; thread = main&#34;,IOguitar.main(),line = 2,668 bci = 35,578 2,668}

主[1]

但我现在该怎么做?

1 个答案:

答案 0 :(得分:0)

Regular expressions是处理这种解析的一种更简单的方法(它是为它做的!)。 String有一个方便的方法split(String regex),可以根据需要拆分字符串,并将其放在字符串数组中,就像您想要的那样。以下行将解决这个问题:

String[] multiplet = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|".split("(\\)|\\|)+");

正则表达式的解释:

\\)

\\转义),因此它是文字“)”

|

这意味着或使用正则表达式语言。

\\|

literal“|”

("|" or ")")+

+表示括号内的任何内容应该至少一次并且是贪婪的(如果两个或更多)或者|相邻它将在所有这些上分开,而不是在它们之间留下空字符串。