@sami beat me to it. Here's what I was working on before he posted:
DECLARE @string VARCHAR(1000) = 'The access is from IP ADDRESS: www.xx.yyy.zz, ...';
SELECT
[start] = fnStart.Here,
[stop] = fnStop.Here,
ItemLen = fnStop.Here-fnStart.Here,
SUBSTRING(@string,fnStart.Here,fnStop.Here-fnStart.Here),
STUFF(@string,fnStart.Here+1,fnStop.Here-fnStart.Here-1,'****')
FROM (VALUES('IP ADDRESS: ')) AS
search(string)
CROSS APPLY (VALUES(CHARINDEX(search.string,@string)+LEN(search.string))) AS fnStart(Here)
CROSS APPLY (VALUES(CHARINDEX(',',@string,fnStart.Here+1))) AS fnStop(Here);
Here's another way using PatternSplitCM. It extracts the IP address, it's length as well as returning the value you are looking for:
DECLARE @string VARCHAR(1000) = 'The access is from IP ADDRESS: www.xx.yyy.zz, ...';
SELECT
ItemLen = fnStop.Here-fnStart.Here,
IPAddress = SUBSTRING(@string,fnStart.Here,fnStop.Here-fnStart.Here),
NewString = STUFF(@string,fnStart.Here+1,fnStop.Here-fnStart.Here-1,'****')
FROM (VALUES('IP ADDRESS: ')) AS search(string)
CROSS APPLY (VALUES(CHARINDEX(search.string,@string)+LEN(search.string))) AS fnStart(Here)
CROSS APPLY (VALUES(CHARINDEX(',',@string,fnStart.Here+1))) AS fnStop(Here);
Results:
ItemLen IPAddress NewString
----------- ----------------- ---------------------------------------------
14 www.xx.yyy.zz The access is from IP ADDRESS: ****, ...