Я пытаюсь разобрать следующий код Cobol в Java.
PNAME. P000
084500 MOVE src1 TO dest1 P110
084510 MOVE src2 TO dest2 P111
084520 MOVE src3 TO dest3 P115
084530 MOVE src4 TO dest4 P120
084540 MOVE src5 TO dest5. P140
084550 PERFORM TOTO THRU TOTO-FN. P310
Моя цель - найти оператор MOVE, соответствующий данному имени.
Пример: с dest5 я хочу найти "MOVE src5 TO dest5."
Мой код Java:
String paragraphePart = "PNAME. P000
084500 MOVE src1 TO dest1 P110
084510 MOVE src2 TO dest2 P111
084520 MOVE src3 TO dest3 P115
084530 MOVE src4 TO dest4 P120
084540 MOVE src5 TO dest5. P140
084550 PERFORM TOTO THRU TOTO-FN. P310";
Matcher m = Pattern.compile("MOVE((?!.*MOVE.*).)*TO\\s+[^\\.]*"+"dest5"+"(\\s+|\\.|$)",Pattern.MULTILINE).matcher(paragraphePart);
while(m.find()){
//treatement on m.group(0)
}
m.group (0) содержит:
MOVE src1 TO dest1 P110
084510 MOVE src2 TO dest2 P111
084520 MOVE src3 TO dest3 P115
084530 MOVE src4 TO dest4 P120
084540 MOVE src5 TO dest5.
Но я только хочу получить эту строку: «ПЕРЕМЕСТИТЬ src5 TO dest5».
В моем регулярном выражении я должен использовать что-то вроде MOVE. * TO, потому что у меня может быть этот случай:
084540 MOVE P120
084550 src5 TO dest5.
Здесь я должен получить MOVE P120.
084550 src5 TO dest5
а не только src5 TO dest5.
Так, как я мог сказать своему регулярному выражению найти MOVE, за которым следует что угодно - но не другое "MOVE" - и затем "TO"?
Спасибо
[решено]
Я использую:
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE).*?\\s+TO\\s+[^\\.]*"+fieldName+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart);
Спасибо анубхава !
https://stackoverflow.com/a/8803309/1140748
[NEW PB]
Использование
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE).*?\\s+TO\\s+[^\\.]*"+"dest5"+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart);
Я могу получить ДВИЖЕНИЕ src5 ДО dest5. Но если я попытаюсь использовать "dest4", чтобы получить эту строку "MOVE src4 TO dest4", это больше не будет работать. У тебя есть идея?
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE.*?"+fieldName+").*?\\s+\\w+\\s+TO\\s+[^\\.]*"+fieldName+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart);