Предполагая, что вы знаете максимальную длину M возможных совпадений регулярного выражения (или можете жить с произвольным значением - или просто использовать весь буфер), вы можете обработать его, не передавая полный буфер, но сохраняя байты M-1 назад. На следующей итерации поместите новые полученные данные в конец байтов M-1 и примените регулярное выражение.
Если вам известен формат передаваемых данных (например, http), вы сможете проанализировать содержимое, чтобы узнать, когда вы достигли конца сообщения, и отослать завершающие байты, которые вы, возможно, кэшировали. Если вы не знаете формат, вам нужно будет установить тайм-аут в recv, чтобы вы не задерживались до конца сеанса связи слишком долго. То, что слишком долго, это то, что вам придется решать самостоятельно,