Am I overthinking?
EDIT: No, I'm undertesting.
DECLARE@Searchedchar(1),
@Newchar(1)
SET @Searched = 'L'
SET @New = 'M'
DECLARE @test-2TABLE(
stringvarchar(1000))
INSERT @test-2
SELECT 'L@*K@*H@/324' AS string
UNION ALL SELECT '(AF#-AR#)*(Y#+BB#)'
UNION ALL SELECT 'TT#*(L#+D@)*L@'
UNION ALL SELECT '((AE#-AR#)*(Y#+A#))/Y#';
WITH cteTally(n) AS ( SELECT TOP 1000 ROW_NUMBER() OVER( Order BY (SELECT NULL)) FROM master.sys.all_columns),
Data AS(
SELECT '+' + string string, n, SUBSTRING( '+' + string, n, 1) ch
FROM @test-2, cteTally)
UPDATE t SET string = STUFF( REPLACE( d.string, dp.ch+d.ch+dn.ch, dp.ch+@New+dn.ch),1,1,'')
FROM @test-2 t
JOIN Data d ON '+' + t.string = d.string
JOIN Data dp ON d.string = dp.string
AND d.n-1 = dp.n
AND dp.ch LIKE '[^A-Z]'
JOIN Data dn ON d.string = dn.string
AND d.n+1 = dn.n
AND dn.ch IN ( '#', '@', '&')
WHERE d.ch = @Searched
SELECT * FROM @test-2