Регулярное выражение: вывод между двумя конкретными словами

#regex

#регулярное выражение

Вопрос:

Текст:

 ITEM 1A.    RISK FACTORS 

    The following is a description of the principal risks inherent in our business.

ITEM 1B.    UNRESOLVED STAFF COMMENTS 

    Not Applicable.
  

Регулярное выражение:

 (?<=RISK).*
  

Понял это:

 ITEM 1A.    RISK **FACTORS** 

    The following is a description of the principal risks inherent in our business.

ITEM 1B.    UNRESOLVED STAFF COMMENTS 

    Not Applicable.
  

Ожидаемый:

 ITEM 1A.    RISK **FACTORS

    The following is a description of the principal risks inherent in our business.

ITEM 1B.    UNRESOLVED STAFF COMMENTS 

    Not Applicable.**
  

Как я могу получить весь текст после слова RISK и перед словом ITEM 1B

Комментарии:

1. Я думаю, вам нужен s модификатор, позволяющий . соответствовать новой строке.

Ответ №1:

Должен работать следующий шаблон:

 (?<=RISK)(.*?)(?=ITEM 1B)
  

Обратите внимание, что в приведенной ниже демонстрации я использую режим DOT ALL. Это означает, что .* может совпадать по символам новой строки, что является поведением, которое вы хотите здесь.

ДЕМОНСТРАЦИЯ

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

Если ваш вариант регулярного выражения не поддерживает DOT ALL, то одним из возможных обходных путей является использование [sS]* :

 (?<=RISK)([sS]*?)(?=ITEM 1B)
  

Ответ №2:

Вы можете сделать это, для чего не требуется использовать модификатор регулярного выражения s (точка во всех):

 (?<=RISK)([Ww]*)(?=ITEM 1B)
  

Демонстрация здесь:https://regex101.com/r/ZUKZxy/4