.*
будет по умолчанию соответствовать столько, сколько может, поэтому ваш RE выбирает последний три столбца (и все, что было до), а не первый три (и все после). Вы можете избежать этого (по крайней мере) двумя способами: (1) вместо .*
ищите [^|]*
или (2) сделайте ваши операторы повторения нежадными: .*?
вместо .*
.
(Или вы можете явно разделить строку вместо того, чтобы сопоставить все это с одним RE. Возможно, вы захотите попробовать оба подхода и посмотреть, какой из них работает лучше, если это имеет значение. Разделение, вероятно, даст более длинный, но более четкий код.)