Quero remover todos os caracteres que não são sublinhados, hífens ou alfanuméricos. Além disso, não quero sublinhado ou hífen como o primeiro caractere, então isso também precisa ser removido.
Isso parece funcionar principalmente usando REGEXP_REPLACE e LTRIM:
SELECT LTRIM(
REGEXP_REPLACE(
'_-Hello(-)World)',
'[^-^_^a-z^A-Z^0-9]*',
''),
'_-') AS "result"
FROM dual;
Isso retorna corretamente:
result
--------------------
Hello-World
No entanto, por algum motivo, isso não funciona quando há uma quebra de linha na string de origem:
SELECT LTRIM(
REGEXP_REPLACE(
'_-Hello(-
)World)',
'[^-^_^a-z^A-Z^0-9]*',
''),
'_-') AS "result"
FROM dual;
Isso retorna "HelloWorld", ou seja, sem o hífen:
result
--------------------
HelloWorld
Também pode haver outros problemas com esta solução que esqueci de mencionar. Então, existe uma maneira melhor de fazer o que estou tentando fazer?
seleciona zero ou mais caracteres que não são (primeiro circunflexo) um hífen, circunflexo (segundo), sublinhado, circunflexo (...), a a z, circunflexo (...), A a Z, circunflexo (para ter certeza) ou zero a nove. Então se você fosse testar com um texto contendo um circunflexo (não em cima de uma vogal), com certeza ele permaneceria, já que você insiste inúmeras vezes.
Além disso, se você estiver usando o SQL*Plus, um recurso interessante é o caractere de continuação de linha, "-" ou hífen.
Talvez leia Continuando um comando SQL*Plus longo em linhas adicionais . Explica sobre o desaparecimento do hífen.