Проблемы с отрицательной последовательной схемой (REGEX) - Поиск неисправных форматированных строк - PullRequest
0 голосов
/ 06 ноября 2018

РЕДАКТИРОВАНО, ЧТОБЫ УЗНАТЬ БОЛЬШЕ ЯСНО

Я придумал следующее регулярное выражение, чтобы помочь мне найти выражения в форме >(0[1-9]|1[0-2])\-\d{4}:\d+(,\d{1,2})?<. Теперь я хочу выяснить, содержит ли мой текст похожие выражения, которые плохо сформированы, то есть выражения, которые соответствуют первая часть регулярного выражения (перед двоеточием), но не соответствует указанному числовому формату, например соответствие >01-2018:a<, >01-2018:12,< или >01-2018:12,111<

Я пробовал следующее, используя отрицательный взгляд >(0[1-9]|1[0-2])\-\d{4}:(?!\d+(,\d{1,2})?).*<

Проблема с моим решением, конечно, в том, что оно будет, так сказать, короткозамкнутым, что даст мне отрицательное совпадение на ie. >01-2018:12,< потому что он соответствует части "12". Я не уверен, как поступить.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете использовать

/>(?:0[1-9]|1[0-2])-\d{4}:(?!\d+(?:,\d{1,2})?<)[^<]*</

См. Демоверсию regex

Детали

  • > - > char
  • (?:0[1-9]|1[0-2]) - номер месяца, от 01 до 12
  • - - дефис (не нужно его избегать)
  • \d{4} - любые 4 цифры
  • : - двоеточие
  • (?!\d+(?:,\d{1,2})?<) - отрицательный прогноз, который не соответствует совпадению, если непосредственно справа от текущего местоположения нет
    • \d+ - 1 или более цифр
    • (?:,\d{1,2})? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям ,, за которыми следуют 1 или 2 цифры
    • < - < char
  • [^<]* - важно! - это потребляет любые 0+ символов кроме <, чтобы добраться до первого ...
  • < - < char.
...