我想要一个正则表达式来提取EVALUATE
和END-EVALAUTE or .
之间的文本。
目前我正在使用正则表达式:
EVALUATE\\s*(((?!EVALUATE|(END-EVALUATE|\\.)).)+)\\s*(END-EVALUATE|\\.)
但我的问题是,如果它出现在双引号内,我不想考虑.
。
请建议任何更好的正则表达或更正我上面提到的那个。
提前致谢。
答案 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
之间的文字“ ”,这似乎意味着他们不应该包括在内。也许我误解了那个,但如果 是要求,那么正则表达式会错误地包含关键字。