If you have colons within quotes, it's easier to replace the whole quoted string with a placeholder. Then you can use Connor's approach:
with t as (
select 'Select person_id, full_name, '':skip'' from per_all_people_f where effective_start_date between :START and :END' str from dual
), quotes_removed as (
select regexp_replace(str, '''.*''', '''###''') str from t
)
select * from quotes_removed;
STR
-----------------------------------------------------------------------------------------------------------
Select person_id, full_name, '###' from per_all_people_f where effective_start_date between :START and :END
with t as (
select 'Select person_id, full_name, '':skip'' from per_all_people_f where effective_start_date between :START and :END' str from dual
), quotes_removed as (
select regexp_replace(str, '''.*''', '''###''') str from t
), binds as (
select regexp_substr(str,'\:\w+',1,i) bind, i pos
from quotes_removed,
( select rownum i from dual
connect by level <= 10 )
)
select listagg(bind, ',') within group (order by pos) binds from binds;
BINDS
------------------------------------------------------------------------------------
:START,:END
Chris