matcher.group() を文字列として取得しようとすると、利用できないことがわかります。なんで?
コード:
private static ArrayList<String> validateList(List<String> listToProcess) {
List<String> resultTemp = new ArrayList<String>();
boolean listIsCorrectlyFormatted = true;
String pattern = "";
pattern = "(\\s)*(\\w\\w(\\w)*)((\\s)(\\w|-|\\.)+)?(((\\s)+|(\\s)+(,)*(\\s)*|(,)(\\s)*)+(\\+(\\d)+)+)?(((\\s)+|(\\s)+(,)*(\\s)*|(,)(\\s)*)+(\\w)+(\\w|\\s|-|,)*[^\\)|^\\(])?(((\\s)+|(\\s)+(,)*(\\s)*|(,)(\\s)*)+\\((\\w)+(\\w|\\s|-|,)*\\))?(\\s)*";
// (\s)*(\w\w(\w)*)((\s)(\w|-|\.)+)?(((\s)+|(\s)+(,)*(\s)*|(,)(\s)*)+(\+(\d)+)+)?(((\s)+|(\s)+(,)*(\s)*|(,)(\s)*)+(\w)+(\w|\s|-|,)*[^\)|^\(])?(((\s)+|(\s)+(,)*(\s)*|(,)(\s)*)+\((\w)+(\w|\s|-|,)*\))?(\s)*
String nameP = "(\\w\\w(\\w)*)((\\s)(\\w|-|\\.)+)?";
String plussP = "(\\+(\\d)+)+";
String commentP = "((\\w)+(\\w|\\s|-|,)*[^\\)|^\\(])|(\\((\\w)+(\\w|\\s|-|,)*\\))";
String tmpStr = "";
int counter = 1;
Matcher matcher;
Pattern generalPt = Pattern.compile(pattern);
Pattern otherPattern = Pattern.compile(""); // *
for (String str : listToProcess) {
if (generalPt.matcher(str).find()) {
// OK
System.out.println("#"+counter+" :: OK ``"+str+"``");
otherPattern = Pattern.compile(nameP); // name
matcher = otherPattern.matcher(str);
matcher.find();
tmpStr += matcher.group(); // name
System.out.println("@NAME@"+matcher.group()+"@");
// -----------------------------------------------------
matcher.reset();
otherPattern = Pattern.compile(plussP); // plus
matcher = otherPattern.matcher(str);
matcher.find();
tmpMatcherGroup = matcher.group();
tmpStr += tmpMatcherGroup;
System.out.println("@PLUS@"+tmpMatcherGroup+"@");
//--------------------------------------------------
matcher.reset();
otherPattern = Pattern.compile(commentP); // comment
matcher = otherPattern.matcher(str);
matcher.find();
tmpStr += matcher.group();
System.out.println("@COMMENT@"+matcher.group()+"@");
//--------------------------------------------------
resultTemp.add(tmpStr);
} else {
// NOK
listIsCorrectlyFormatted = false;
tmpStr = "ERROR at line: # " + counter;
resultTemp.add(tmpStr);
System.out.println("#"+counter+" :: NOT OK ``"+str+"``");
}
counter++;
}
List<String> result = new ArrayList<String>();
result.add(Boolean.toString(listIsCorrectlyFormatted));
result.addAll(resultTemp);
return (ArrayList<String>) result;
}
スタックトレース:
Thread [main] (Suspended (exception IllegalStateException))
Matcher.group(int) line: not available
Matcher.group() line: not available [local variables unavailable]
DataProcess.validateList(List<String>) line: 111
DataProcess.main(String[]) line: 15
解決:
matcher.reset();
otherPattern = Pattern.compile(plussP); // plus
matcher = otherPattern.matcher(str);
matcher.find();
try {
if (matcher.groupCount() > 0) {
tmpMatcherGroup = matcher.group();
}
} catch (IllegalStateException e) {
System.out.println(e);
}
tmpStr += tmpMatcherGroup;
System.out.println("@PLUS@" + tmpMatcherGroup + "@");