Проблема пытается отрицать слово в регулярном выражении Java - PullRequest
4 голосов
/ 10 января 2012

Я пытаюсь разобрать следующий код 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);


Ответы [ 2 ]

1 голос
/ 10 января 2012

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

String needle = "dest5";
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE.*?" + needle + ").*?\\s+.+?\\s+TO\\s+" + needle + ")", Pattern.DOTALL).matcher(paragraphePart);
0 голосов
/ 10 января 2012

Нет простого способа отрицать целое слово, вы можете отрицать только букву за буквой.

Мне кажется, что самый простой способ сделать это - использовать обычный код Java, а не регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...