Java multiple.replace不提供任何TouchElementException
编辑: 整个方法是:Java multiple.replace不提供任何TouchElementException,java,parsing,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))); InputS
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[i]
作为
这是正确的。但当我试着读入时:
A、 A,A,B,B,C,B,B,C,Bb,Bb,Cb | A,B,C,D,E,F,G,|,A,,,,,,,,,,,,,,,,,,我得到了一个非接触式的例外。正确的输出是:
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, , , , , , , , , , , , , ,
有人知道我为什么以及我应该做什么来获得正确的输出吗
编辑:
调试将提供以下堆栈跟踪:
断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306
2769 matrix3[0][0]=s2.useDelimiterU.next
主[1]步骤
步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322
2770多重态[i]=matrix3[0][0]
主[1]步骤
步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333
2767表示int i=0;iString[] 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("(\\)|\\|)+");
正则表达式的解释:
\\)
\\转义,因此它是文字
|
这在正则表达式语言中表示或
\\|
文字的|
("|" or ")")+
+表示括号内的任何内容都应该至少有一次,并且是贪婪的,因此,如果两个或多个或|相邻,它将在所有括号内拆分,并且不会在它们之间留下空字符串。是否可以发布堆栈跟踪?Java:写入一次,到处调试。你试过一步一步地调试你的程序以更好地理解发生了什么吗?我已经在编辑下发布了stacktrace。另外,我认为可能有一种更简单的方法来实现wha
你不想要。如果你能解释你真正想要实现的目标,那可能是获得帮助的一个好方法;在字符串A,A,A,B,B,C,B,B,C,Bb,Bb,Cb | A,B,C,D,E,F,G,|,A,,,,,,,,,,我仍然得到一个无接触元素例外。现在该怎么办?@user1189952.split\\\\\\\\+在这里可以正常工作。。看起来你改变了正则表达式?我有代码:String[]numbers=newstring[40];当line=bReader.readLine!=空{numbers=line.split[\\\\\\\\]+},因此它在该行中读取。但是使用.split |\\\\\\+我仍然得到NoSuchElementException。split为您完成全部工作-您不需要调用scanner.next,在正则表达式之后。。我想还不清楚你想要什么样的最终结果。Regex可以做很多事情,而不仅仅是拆分,它可以真正为您完成所有解析。
\\|
("|" or ")")+