Регулярное выражение - исключить «1» или «11» из середины захвата. - PullRequest
0 голосов
/ 07 мая 2020

У меня есть это выражение для записи текста сезонов и их года

(?:WIN\w+|SPR\w+|SUM\w+|FA\w+) \d{4}

Типичное совпадение, которое я хочу зафиксировать, форматируется как «ОСЕНЬ 2011» или «ВЕСНА 2019» и т. Д. c, но Лето отличается от этого формата и может быть либо «Лето 1 2011», либо «Лето 11 2011», которое фиксируется как «Лето 1201» или «Лето 1120». Я хочу, чтобы выражение соответствовало временам года и фиксировало год, но для лета ему нужно игнорировать '1' или '11' перед захватом года.

Я пытался изменить его, добавив отрицательный просмотр вперед, чтобы игнорировать любой шаблон «1 (пробел)» или «11 (пробел)», который он находит перед годом, поскольку в большинстве случаев он просто находит год, который состоит из четырех последовательных чисел, а в случае лета - должен найти и пропустить 1 или 11, но мое тестирование показало, что мое измененное выражение не работает. Я все еще не очень разбираюсь в регулярных выражениях.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

После сезона вы должны «привязать» к последним четырем цифрам. Ниже приведен шаблон для этого:

(SUMMER|FALL|WINTER|SPRING).+?(\d{4})(?=\D|$)

Пояснение:

(SUMMER|FALL|WINTER|SPRING) - чередование, соответствие одному из четырех сезонов и сохранение его в первой группе захвата

.+? - соответствие 1+ любых символов, не жадное

(\d{4}) - соответствие четырем цифрам и сохранение их во второй группе захвата

(?=\D|$) - положительный просмотр вперед, утверждение, что следующее не является di git \D или конец строки $

Демо

0 голосов
/ 08 мая 2020

Вы не указали язык, который используете. Если он поддерживает \K, как PCRE (PHP) и другие, вы можете разделить свою строку на соответствие следующему регулярному выражению.

^(?:(?:FALL|WINTER|SPRING)\K +|SUMMER\K(?: +11?)? +)(?=\d{4}$)

Demo

Если бы строка была одной из следующих

SUMMER 11 2011
      ^^^^
SUMMER 1 2011
      ^^^
SUMMER 2011
      ^
FALL 2011
    ^

, регулярное выражение соответствовало бы символу (-ам) на шляпе (-ах). Если бы строка была первой из этих примеров, разбиение на " 11 " привело бы к массиву ["SUMMER", "2011"].

Если бы строка была одной из следующих:

SUMMER 12 2011
WINTER 1 2020

, не было бы совпадение, сигнализирующее о проблеме с данными.

Механизм регулярных выражений PCRE выполняет следующие операции.

^
(?:
  (?:FALL|WINTER|SPRING)  match 'FALL', 'WINTER' or 'SPRING' 
  \K +                    forget everything matched so far then match 1+ spaces
  |                       or
  SUMMER                  match 'SUMMER'
  \K                      forget everything matched so far
  (?: +11?)? +            optionally match 1+ spaces, then '1', then optionally
                          match '1', followed by 1+ spaces
)                         end non-capture group
(?=\d{4}$)                match 4 digits at end of the line in a positive lookahead

Взято из демонстрационной ссылки, "\ K сбрасывает начальную точку сообщенного совпадения . "

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