2017-05-02 2 views

Répondre

1

Vous pouvez étendre le modèle à:

select regexp_substr('Helloworld - test0 - test!' ,'[^ -]+ - [^ -]+$', 1, 1) 
from dual; 

REGEXP_SUBSTR 
------------- 
test0 - test! 

... qui traite toute exécution des espaces et des tirets même, que votre modèle original a fait (parce qu'il est entre crochets).

Vous pouvez également utiliser regexp_replace() avec des références arrières (ce qui peut probablement être simplifiée!):

select regexp_replace('Helloworld - test0 - test!' ,'(.*)(-)(.*)(-)(.*)$', '\3\4\5') 
from dual; 

REGEXP_REPLAC 
------------- 
test0 - test! 

Mais vous n'avez pas besoin des expressions régulières, aussi longtemps que vous savez qu'il ya au moins deux - séparateurs vous peut utiliser substr() avec instr():

select substr('Helloworld - test0 - test!', 
    instr('Helloworld - test0 - test!', ' - ', -1, 2) + 3) 
from dual; 

SUBSTR('HELLO 
------------- 
test0 - test! 

les instr() décompté à partir de la fin de la chaîne (à cause du -1 comme troisième argument) , et trouve la deuxième apparition en comptant à rebours, ce qui vous met à l'espace immédiatement après le d. Vous ajoutez ensuite trois pour revenir sur le délimiteur, pour trouver le début du bit que vous voulez.


Si vous voulez vraiment sauter le premier jeton (comme vous le suggérez dans un commentaire), plutôt que de toujours obtenir les deux derniers jetons (comme la question dit), il est encore plus facile:

select substr('Helloworld - test0 - test!', 
    instr('Helloworld - test0 - test!', ' - ', 1, 1) + 3) 
from dual; 

SUBSTR('HELLO 
------------- 
test0 - test! 

ou avec votre deuxième chaîne:

select substr('welcome - to - stackoverflow - test!', 
    instr('welcome - to - stackoverflow - test', ' - ', 1, 1) + 3) 
from dual; 

SUBSTR('WELCOME-TO-STACKOV 
-------------------------- 
to - stackoverflow - test! 

vous pouvez toujours utiliser regexp_replace() si vous préférez, mais il est généralement plus cher:

select regexp_replace('Helloworld - test0 - test!', '^[^ -]+ - ', null, 1, 1) 
from dual; 

REGEXP_REPLAC 
------------- 
test0 - test! 

select regexp_replace('welcome - to - stackoverflow - test!', '^[^ -]+ - ', null, 1, 1) 
from dual; 

REGEXP_REPLACE('WELCOME-TO 
-------------------------- 
to - stackoverflow - test! 

Si vous voulez fendus sur un tableau de bord, pas d'espace au tableau de bord de l'espace, alors qui est encore plus simple. mais si vous souhaitez également supprimer les espaces de premier plan qui laisse derrière vous aurez besoin d'ajouter une garniture pour se débarrasser de cette:

ltrim(substr(your_string, instr(your_string, '-', 1, 1) + 1)) 

ou:

ltrim(regexp_replace(your_string ,'^[^-]+-', null, 1, 1)) 

ou le supprimer dans le cadre du motif:

regexp_replace(your_string ,'^[^- ]+ ?- ?', null, 1, 1) 

etc.

+0

Merci Alex! J'ai une autre question.Je ne veux pas considérer le premier mot après la séparation de la chaîne.so, Puis-je utiliser la requête de ne pas considérer le premier mot et s'il vous plaît laissez-moi savoir s'il y a une requête? – user3282682

+0

Désolé, je n'ai aucune idée de ce que vous voulez dire. Vous avez dit que vous vouliez les deux derniers éléments délimités.Tout cela semble produire la sortie que vous avez voulue. –

+0

Ma condition est, j'ai besoin d'afficher tous les mots avec délimiteur "-" après le premier délimiteur "-". Par exemple, welcome-to-stackoverflow -test, Toujours je ne considérerai pas le mot welcome et je veux afficher -stackoverflow -test dynamiquement – user3282682