Использование регулярных выражений для идентификации нодлистов

1

Следующая информация должна быть разделена на два массива:

  • foo089, бар [120-123,215]

Желаемый результат - это два массива со всеми перечисленными в нем номерами [089] и [120-123,215] (даже лучше было бы 120,121,122,123 вместо 120-123, это необязательно).

Другие примеры, которые следует проанализировать:

  • Foo [133,370,390-391], bar120
  • foo123
  • bar145
  • бар [121,303]
  • foo123, bar145

Все это должно привести к созданию двухэлементного массива (сначала foo, second bar), либо с одной записью (например, 123 или 145), либо с диапазонами (например, 133 370 390 379 или 121 303).

Мне всегда нужны два массива, чтобы легко определить, принадлежит ли номер foo или bar.

ограничения

  • foo или bar не обязательно должны существовать
  • если они существуют, они всегда упорядочены
  • цифры всегда имеют 3 цифры
  • есть только foo и bar, никакие другие слова
  • foo234, foo425 НЕ допускается. Если foo или bar имеет более одного номера, он указан в скобках

До сих пор я пробовал следующее регулярное выражение: \d{3}|foo\d{3}|bar\d{3}|\d{3}-\d{3}. Однако с preg_grep в php я не получаю желаемого результата.

Теги:

1 ответ

2
Лучший ответ
^(?!foo\d{3},bar\d{3})(?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?,?(?:bar(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?$

Теперь в результате совпадения первая группа - это номера для foo а вторая группа - числа для bar.

Объяснение:

  1. (?:\d{3}(?:-\d{3})? - три цифры или три цифры, тире, три цифры
  2. (?:\d{3}(?:-\d{3})?,?)+ - повторенное несколько раз, возможно разделенное запятой
  3. \[(?:\d{3}(?:-\d{3})?,?)+\] - то же самое, но в квадратных скобках
  4. |\d{3} - альтернативно, всего три цифры
  5. (?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))? выше, но предшествовал foo и сделал необязательным с ?
  6. ,? - дополнительная запятая для разделения foo и bar
  7. Часть бара почти такая же, как и для foo
  8. (?!foo\d{3},bar\d{3}) - запретить такие вещи, как foo123, bar456
  9. ^$ - совпадение от начала до конца

Смотрите здесь в действии

  • 0
    Выглядит неплохо! Однако я не могу извлечь информацию из моей строки в php. Как мне получить два массива из этого регулярного выражения?
  • 0
    При совпадении первым результатом группы будут числа для foo, а вторым - для bar . Также как foo089,bar[120-123,215] первая группа возвращает 089 а вторая группа возвращает [120-123,215] .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню