Regex Consistent Grouping - PullRequest
       30

Regex Consistent Grouping

2 голосов
/ 03 июня 2019

У меня довольно грязное регулярное выражение, измененное с RegEx для захвата повторяющегося шаблона https://regex101.com/r/Trdwks/1

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

Идея в том, что оно соответствует этой строке, группируя часы, минуты,и описание.

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


1h 14min: Title 
- another Great one 42min: Title - Great Movie
- 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:
  "3h: SECOND TITLE
 - Description Line 1
 - Description Line 2
 - Description Line 3"

      Group 1: "1h"
      Group 2: ""
      Group 3: "SECOND TITLE
               - Description Line 1
               - Description Line 2
               - Description Line 3"

Match 3:
  "1h 14min: Title 
   - another Great one"

      Group 1: "1h"
      Group 2: "14min"
      Group 3: "Title 
                - another Great one"

Match 4:
  "42min: Title - Great Movie
   - Description Line 2
   - Description Line 3"

      Group 1: ""
      Group 2: "42min"
      Group 3: "Title - Great Movie
                - Description Line 2
                - Description Line 3"

У меня много проблем с согласованием группировки, так как может быть только часы, только минуты,или оба.Таким образом, приведенное выше регулярное выражение может поставить минуты в group 3 или group 6.Есть ли способ исправить группировку в инициале или операторе, чтобы она возвращала согласованную группировку в каждом сценарии?

1 Ответ

3 голосов
/ 03 июня 2019

Это решение просто должно поддерживать прогнозное утверждение.

(?s)(?=[^:]*\d[^:]*:)(([0-9]{1,2}h)?[ ]*([0-9]{1,2}min)?:\s*)((?:.(?!(\dh\s\d{1,2}min|\dh|\d{1,2}min)))+)

https://regex101.com/r/gz4r9g/1

Расширенное

 (?s)
 (?= [^:]* \d [^:]* : )
 (                             # (1 start)
      ( [0-9]{1,2} h )?             # (2)
      [ ]* 
      ( [0-9]{1,2} min )?           # (3)
      : \s* 
 )                             # (1 end)
 (                             # (4 start)
      (?:
           . 
           (?!
                (                             # (5 start)
                     \d h \s \d{1,2} min
                  |  \d h
                  |  \d{1,2} min 
                )                             # (5 end)
           )
      )+
 )                             # (4 end)

Это решение просто должно поддерживать сброс ветви.

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

https://regex101.com/r/pyACdi/1

Расширен

 (?s)
 (?|
      ( [0-9]{1,2} h )              # (1)
      [ ]* 
      ( [0-9]{1,2} min )            # (2)
   |  ( [0-9]{1,2} h )              # (1)
      ( )                           # (2)
   |  ( )                           # (1)
      ( [0-9]{1,2} min )            # (2)
 )
 : \s* 
 (                             # (3 start)
      (?:
           . 
           (?!
                (                             # (4 start)
                     \d h \s \d{1,2} min
                  |  \d h
                  |  \d{1,2} min 
                )                             # (4 end)
           )
      )+
 )                             # (3 end)
...