Следующая информация должна быть разделена на два массива:
Желаемый результат - это два массива со всеми перечисленными в нем номерами [089] и [120-123,215] (даже лучше было бы 120,121,122,123 вместо 120-123, это необязательно).
Другие примеры, которые следует проанализировать:
Все это должно привести к созданию двухэлементного массива (сначала foo, second bar), либо с одной записью (например, 123 или 145), либо с диапазонами (например, 133 370 390 379 или 121 303).
Мне всегда нужны два массива, чтобы легко определить, принадлежит ли номер foo или bar.
ограничения
До сих пор я пробовал следующее регулярное выражение: \d{3}|foo\d{3}|bar\d{3}|\d{3}-\d{3}
. Однако с preg_grep в php я не получаю желаемого результата.
^(?!foo\d{3},bar\d{3})(?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?,?(?:bar(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?$
Теперь в результате совпадения первая группа - это номера для foo
а вторая группа - числа для bar
.
Объяснение:
(?:\d{3}(?:-\d{3})?
- три цифры или три цифры, тире, три цифры(?:\d{3}(?:-\d{3})?,?)+
- повторенное несколько раз, возможно разделенное запятой\[(?:\d{3}(?:-\d{3})?,?)+\]
- то же самое, но в квадратных скобках|\d{3}
- альтернативно, всего три цифры(?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?
выше, но предшествовал foo
и сделал необязательным с ?
,?
- дополнительная запятая для разделения foo и bar(?!foo\d{3},bar\d{3})
- запретить такие вещи, как foo123, bar456^$
- совпадение от начала до конца
foo089,bar[120-123,215]
первая группа возвращает089
а вторая группа возвращает[120-123,215]
.