RegEx для захвата шаблона с новыми линиями - PullRequest
2 голосов
/ 27 мая 2019

У меня есть следующая строка

1h 30min: Title 
- Description Line 1
1h 30min: Title
- Description Line 1
- Description Line 2
- Description Line 3

И я хотел бы получить следующие результаты, используя регулярное выражение.

Match 1:
  "1h 30min: Title 
  - Description Line 1"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title 
               - Description Line 1"
Match 2:
  "1h 30min: Title 
  - Description Line 1
  - Description Line 2
  - Description Line 3"

      Group 1: "1h"
      Group 2: "30min"
      Group 3: "Title 
               - Description Line 1
               - Description Line 2
               - Description Line 3"

У меня есть следующее регулярное выражение https://regex101.com/r/dp5zKq/1

(([0-9]{1,2}h)\s*([0-9]{1,2}min)*\:)+?((.*\n*)*)

Однако я не могу понять, как заставить регулярное выражение любого символа / новой строки останавливаться, когда оно достигает нового совпадения в течение часов и минут.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 27 мая 2019

Вы можете немного изменить свое регулярное выражение, чтобы использовать положительный прогноз для остановки перед временной строкой или концом ввода, используя это регулярное выражение, а также использовать [\w\W] для захвата нескольких строк,

([0-9]{1,2}h)\s*([0-9]{1,2}min)*:\s*([\w\W]*?)(?=[0-9]{1,2}h\s*([0-9]{1,2}min)|$)

Regex Demo 1

OR

Еще лучше регулярное выражение, если время может появиться в описании в любом месте, вы можете использовать это регулярное выражение, которое использует многострочный режим, а в перспективе использует ^, чтобы убедиться, что оно не останавливается, если время присутствует в описании где-либо и использует \Z для обозначения абсолютного конца строки.

([0-9]{1,2}h)\s*([0-9]{1,2}min)*:\s*([\w\W]*?)(?=^[0-9]{1,2}h\s*[0-9]{1,2}min|\Z)

Regex Demo 2

Дайте мне знать, если это работает для вас.

2 голосов
/ 27 мая 2019

Вы можете сопоставить части h и min в группах 1 и 2.

Затем используйте повторяющийся паттерн, который соответствует всей строке, если он не начинается с часового паттерна (или включите также и минуты после этого.

([0-9]{1,2}h)[ ]*([0-9]{1,2}min):[ ]*(.*(?:\n(?![0-9]{1,2}h).*)*)

Объяснение

  • ([0-9]{1,2}h)[ ]* Группа захвата 1, формат h
  • ([0-9]{1,2}min) Группа захвата 2, формат min
  • :[ ]* Совпадение: и пробелы 1+ (пробел не обязательно должен быть в классе символов, это только для ясности)
  • ( Захватывающая группа 3
    • .* Соответствует любому символу, кроме новой строки 0+ раз
    • (?: Группа без захвата
    • \n(?![0-9]{1,2}h).* Соответствует новой строке, утверждая, что справа не является шаблоном h. Если это не так, сопоставьте любой символ кроме символа новой строки 0+ раз
    • ) Закрыть группу без захвата и повторить 0+ раз
  • ) Закрыть группу 3

Regex demo

1 голос
/ 27 мая 2019

Полагаю, это может быть желаемое или близкое выражение:

([\s\S]*?)(([0-9]{1,2}h)\s*([0-9]{1,2}min)*\:)?

DEMO

...