Регулярное выражение для идентификации блока Cobol EVALUATE с JAVA - PullRequest
0 голосов
/ 09 января 2012

Я хочу, чтобы регулярное выражение извлекало текст между EVALUATE и END-EVALAUTE or ., который когда-либо стоит первым.

В настоящее время я использую регулярное выражение:

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

Но моя проблема в том, что я не хочу учитывать ., если оно заключено в двойные кавычки.

Пожалуйста, предложите лучшее регулярное выражение или исправьте то, что я упомянул выше.

Спасибозаранее.

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Просто подумал, что могу указать, что регулярное выражение, данное Бартом, будет соответствовать базовому одноуровневому блоку 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, найденного в строке (это не внутри кавычек), увеличить оценку «уровень».Таким образом, вы можете отслеживать, где находитесь на вложенных уровнях.

Кроме того, ОП сказал, что он ищет способ получить текст " между " EVALUATE иEND-EVALUATE, что, по-видимому, подразумевает, что они не должны быть включены.Может быть, я неверно истолковал это, но если это является требованием, тогда регулярное выражение неправильно включает ключевые слова.

0 голосов
/ 09 января 2012

Вы можете попробовать это:

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
...