This expression will replace the first instance of caret up to the subsequent pipe (or end of string.) You can just run a loop until no more rows are updated or no more carets are found inside the function, etc.
case
when charindex('^', s) > 0
then stuff(
s,
charindex('^', s),
charindex('|', s + '|', charindex('^', s) + 1) - charindex('^', s),
''
)
else s
end
Here's a loop you can adapt for a function definition:
declare @s varchar(30) = 'a|b^c^d|e|f^g|h^i';
declare @n int = charindex('^', @s);
while @n > 0
begin
set @s = stuff(@s, @n, charindex('|', @s + '|', @n + 1) - @n, '');
set @n = charindex('^', @s, @n + 1);
end
select @s;
A little bit of care needs to be taken for the trailing of the string where there won't be a final pipe separator. You can see I've handled that.
a|ab^cd^ef|e^da?