Your take_until will try to parse all up to ", including \. But the docs for escaped state that The first argument matches the normal characters (it must not accept the control character). So I guess it should not match the \. So I tried take_until("\"\\") instead, but this doesn't mean “take until " or \”, but searches for "\ literal.