Регулярное выражение - сопоставить все между BEGIN и END - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь выяснить, как создать регулярное выражение, совпадающее со всем текстом между первым «BEGIN» и последним «END» блока процедуры.

Вот текст, который я хочу отфильтровать:

PROCEDURE MyFirstFunction()@12345
VAR
    TESTVAR@1 : Record 1;
    TESTVAR@2 : Record 2;
BEGIN
    // Here begins the code
    IF 1 = 1 THEN BEGIN
        IF 2 <> 1 THEN BEGIN
            MESSAGE('2 is not equal to 1');
        END;
        MESSAGE('1 is equal to 1');
    END;
END;

PROCEDURE MySecondFunction()@123456
VAR
    TESTVAR@1 : Record 1;
    TESTVAR@2 : Record 2;
BEGIN
    // Here begins the code
    IF 1 = 1 THEN BEGIN
        IF 2 <> 1 THEN BEGIN
            MESSAGE('2 is not equal to 1');
        END;
        MESSAGE('1 is equal to 1');
    END;
END;

PROCEDURE MyThirdFunction()@123457
VAR
    TESTVAR@1 : Record 1;
    TESTVAR@2 : Record 2;
BEGIN
    // Here begins the code
    IF 1 = 1 THEN BEGIN
        IF 2 <> 1 THEN BEGIN
            MESSAGE('2 is not equal to 1');
        END;
        MESSAGE('1 is equal to 1');
    END;
END;

Я уже пробовал это с рекурсивным регулярным выражением, но это не сработало.

Вот регулярное выражение, над которым я работал:

BEGIN(((?!BEGIN|END;).)|(?R))*END;

Но я получаю только второе начало первой функции.

Вот ссылка на regex101.com для проверки регулярного выражения: https://regex101.com/r/ZoBm6h/1

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Если вы хотите сопоставить все блоки, вы также можете использовать это регулярное выражение:

BEGIN((?!^(?!PROCEDURE)$).)*END

0 голосов
/ 24 августа 2018

Я думаю, что логика, которую вы хотите использовать для негативного взгляда, состоит в том, что он должен жадно потреблять все после BEGIN до достижения последнего END, при условии, что он также не видит текст PROCEDURE, что будет означать, что это зашел слишком далеко и вошел в следующий блок процедур.

BEGIN((?!PROCEDURE).)*END;

Демо

...