There is another case that isn't handled (more of an edge case, but still valid syntax).
declare
str1 varchar2(3000) := q'[Hello, I'm a 'string' :)]';
str2 varchar2(3000) := q'^Hello, I'm a 'string' :)^';
begin
dbms_output.put_line(str1);
dbms_output.put_line(str2);
end;
According...