-2

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 + "@");
4

2 に答える 2

1

最初にgroupCount()を確認する必要があり、それが 0 より大きい場合は、変数を割り当てる必要があります。

   while(m.find()) {
      for(int i = 0; i<=m.groupCount() ; i++) {
           ...Your code
      }
    }
于 2012-11-16T11:38:26.263 に答える
1

説明はjavadocにあります:

スロー:

IllegalStateException - 一致がまだ試行されていない場合、または前の一致操作が失敗した場合

于 2012-11-16T11:39:59.803 に答える