Вы забыли пробелы между ними, а также не группируете скобками. Как я понимаю, вы хотите захватить цену. Таким образом, мы фиксируем это с помощью \ d + и проверяем, существует ли необходимый контекст с таким прогнозом, как (? = \ | КУПИТЬ 1 GET 1 50%)
\d+(?= ?\| ?BUY 1[, ] ?GET 1(?:,? ?| at )50%)
\d+(?= ?\| ?BUY 1[, ] ?GET 1(?:, ?| at )40%)
demo
https://regex101.com/r/vG1kzW/3
https://regex101.com/r/QImMZf/2