2010-12-02 11 views
0

J'ai besoin de votre aide pour résoudre cette question.Expressions régulières, quel ennui!

Je déclare que je ne suis pas capable d'utiliser des expressions régolaires avec Oracle PL/SQL, mais je promets de les étudier dès que possible!

Veuillez supposer que vous avez une table avec une colonne appelée MY_COLUMN de type VARCHAR2 (4000).

Ce colums est peuplé comme suit:

Description of first no.;0;Description of 2nd number;91399399119;Third Descr.;13456 

Vous pouvez voir que les chaînes sont composées par deux chiffres (qui peut commencer par zéro) et des chaînes (contenant tous les caractères alphanumériques, et également point, », /, \, etc.):

Description1;Number1;Description2;Number2;Description3;Number3;......;DescriptionN;NumberN 

Bien sûr, N ne sait pas, cela signifie que le nombre de couples pour chaque enregistrement peut varier d'un enregistrement à.

Dans chaque couple le premier élément est toujours le nombre (qui peut commencer par zéro, je répète), et le deuxième élément est la chaîne.

Le séparateur de champ est toujours point-virgule (;).

Je voudrais transformer les chiffres comme suit:

0===> 001-23457 
91399399119 ===> 913-99399119 
13456 ===> 134-56 

Cela signifie, après les trois premiers chiffres du numéro, je dois mettre un tiret « - »

Comment puis-je obtenir cela en utilisant des expressions régulières?

Merci d'avance pour votre aimable collaboration!

Répondre

1

Je ne sais pas Oracle/PL/SQL, mais je peux fournir un regex:

([[:digit:]]{3})([[:digit:]]+) 

correspond à un certain nombre d'au moins quatre chiffres et rappelle les trois premiers séparément du reste.

RegexBuddy construit l'extrait de code suivant de ceci:

DECLARE 
    result VARCHAR2(255); 
BEGIN 
    result := REGEXP_REPLACE(subject, '([[:digit:]]{3})([[:digit:]]+)', '\1-\2', 1, 0, 'c'); 
END; 

Si vous devez vous assurer que ces chiffres sont toujours directement entourés par ;, vous pouvez modifier ce peu:

(^|;)([[:digit:]]{3})([[:digit:]]+)(;|$) 

Cependant , cela ne fonctionnera pas si deux nombres peuvent se suivre directement (12345;67890 ne correspondra qu'au premier nombre). Si ce n'est pas un problème, utilisez

result := REGEXP_REPLACE(subject, '(^|;)([[:digit:]]{3})([[:digit:]]+)(;|$)', '\1\2-\3\4', 1, 0, 'c'); 
+0

Des solutions parfaites, ça marche super !! Merci beaucoup!! ;-) – UltraCommit