使用JAVA识别Cobol EVALUATE块的正则表达式

时间:2012-01-09 08:23:51

标签: java regex cobol

我想要一个正则表达式来提取EVALUATEEND-EVALAUTE or .之间的文本。

目前我正在使用正则表达式:

EVALUATE\\s*(((?!EVALUATE|(END-EVALUATE|\\.)).)+)\\s*(END-EVALUATE|\\.)

但我的问题是,如果它出现在双引号内,我不想考虑.

请建议任何更好的正则表达或更正我上面提到的那个。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

EVALUATE("[^"]*"|((?!EVALUATE|END-EVALUATE)[^."])+)*(END-EVALUATE|\.)

Java演示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) throws Exception {

        String src =
                "    EVALUATE WS-ADDITIONAL-FILE-WORK                           \n" +
                "            WHEN \"ACCNT\"                                     \n" +
                "                IF LINK-TRIG-FILE-NAME NOT = \"ACTMSTR   \"    \n" +
                "                PERFORM 04510-GET-ACCOUNT-MASTER               \n" +
                "                ELSE                                           \n" +
                "                MOVE \"0106H\"             TO WS-ERROR-CODE    \n" +
                "                PERFORM 09000-PROCESS-ABORT-ERROR              \n" +
                "                END-IF                                         \n" +
                "             WHEN \"ADDRM\"                                    \n" +
                "                 IF LINK-TRIG-FILE-NAME NOT = \"ADDRMSTR  \"   \n" +
                "                 IF PROGRAM-HBMS-RELEASE (1:3) > \"5.0\"       \n" +
                "                   PERFORM 04520-GET-ADDRESS-MASTER            \n" +
                "                 END-IF                                        \n" +
                "                 ELSE                                          \n" +
                "                   MOVE \"0106H\"        TO WS-ERROR-CODE      \n" +
                "                 PERFORM 09000-PROCESS-ABORT-ERROR             \n" +
                "                 END-IF                                        \n" +
                "             WHEN OTHER                                        \n" +
                "                 MOVE \"0106F\"             TO WS-ERROR-CODE   \n" +
                "                 PERFORM 09000-PROCESS-ABORT-ERROR             \n" +
                "    END-EVALUATE.                                                ";

        Matcher m = Pattern.compile("EVALUATE(\"[^\"]*\"|((?!EVALUATE|END-EVALUATE)[^.\"])+)*(END-EVALUATE|\\.)").matcher(src);

        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

打印:

EVALUATE WS-ADDITIONAL-FILE-WORK                           
        WHEN "ACCNT"                                     
            IF LINK-TRIG-FILE-NAME NOT = "ACTMSTR   "    
            PERFORM 04510-GET-ACCOUNT-MASTER               
            ELSE                                           
            MOVE "0106H"             TO WS-ERROR-CODE    
            PERFORM 09000-PROCESS-ABORT-ERROR              
            END-IF                                         
        WHEN "ADDRM"                                    
            IF LINK-TRIG-FILE-NAME NOT = "ADDRMSTR  "   
            IF PROGRAM-HBMS-RELEASE (1:3) > "5.0"       
              PERFORM 04520-GET-ADDRESS-MASTER            
            END-IF                                        
            ELSE                                          
              MOVE "0106H"        TO WS-ERROR-CODE      
            PERFORM 09000-PROCESS-ABORT-ERROR             
            END-IF                                        
        WHEN OTHER                                        
            MOVE "0106F"             TO WS-ERROR-CODE   
            PERFORM 09000-PROCESS-ABORT-ERROR             
END-EVALUATE

答案 1 :(得分:0)

我想我会指出Bart提供的正则表达式会匹配一个基本的单级EVALUATE块,但是它不会处理嵌套 EVALUATE

例如,尝试使用以下示例中的正则表达式:

EVALAUTE TRUE
   WHEN FILE-ERROR
      EVALUATE ERROR-CODE
         WHEN FILE-NOT-FOUND
            DISPLAY "File Not Found!"
         WHEN ACCESS-DENIED
            DISPLAY "Access Denied!"
      END-EVALUATE
   WHEN OTHER
      DISPLAY "Success!"
END-EVALUATE

另一种方法是逐行读取Cobol源,并在线上找到每个EVALUATE(不在引号内),增加一个评估'级别'。这样,您就可以跟踪嵌套级别中的位置。

此外,OP表示他正在寻找一种方法来获取{{1>}和EVALUATE之间的文字“ ”,这似乎意味着他们不应该包括在内。也许我误解了那个,但如果 是要求,那么正则表达式会错误地包含关键字。