2009-03-20 7 views
2

J'utilise une expression régulière pour savoir si la valeur entrée par l'utilisateur est alphanumérique, autorisant certains caractères spéciaux.Expression régulière dans PL/SQL

J'utilise le code suivant qui fonctionne très bien:

CREATE OR REPLACE PROCEDURE Validate_Inputstring (input_String IN VARCHAR2) AS 
BEGIN 

    IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z,[email protected]]*$') THEN 
     DBMS_OUTPUT.PUT_LINE('U have entered alphanumeric chars--->'|| input_String); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('U NOT have entered alphanumeric chars---->'|| input_String); 
    END IF; 
END; 

Les programmes ci-dessus fonctionne très bien.
Maintenant, mon poblem est ces symboles spéciaux sont dynamiques et ces valeurs varient selon l'application. En d'autres termes, ceux-ci sont stockés dans la base de données et différents pour chaque application.

Par exemple, pour l'application A, ces valeurs peuvent être , + - ? @, pour B, elles peuvent être {^& '.

Est-il possible d'écrire une expression régulière de sorte qu'elle vérifie les caractères alphanumériques et ces symboles spéciaux dynamiques à la fois?

J'ai essayé quelque chose comme

CREATE OR REPLACE PROCEDURE Validate_Inputstring (input_String IN VARCHAR2) AS 
    special_symbols  VARCHAR2(300); 

BEGIN 
    special_symbols :=',+-?'; 
    IF REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$') THEN 
     DBMS_OUTPUT.PUT_LINE('U have entered alphanumeric chars--->'|| input_String); 
     ELSE 
     DBMS_OUTPUT.PUT_LINE('U NOT have entered alphanumeric chars---->'|| input_String); 
    END IF; 
END; 

mais il ne fonctionne pas. Quelqu'un at-il une solution pour cela? Merci d'avance!

+0

Est-ce un projet amusant qui nécessite une sortie Lolcode? – Svante

Répondre

0

REGEXP_LIKE (input_String, '^ [A-z0-9A-zspecial_symbols] * $')

Vous devez sortir de la chaîne pour interpoler vos symboles:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_symbols+']*$') 

Cependant, il y a un petit problème dans le fait que vos symboles spéciaux peuvent aussi être spéciaux pour regex. Un '-' dans une classe [] -character-class fait une plage au lieu de littéralement '-'; un ']' mettrait prématurément fin à la classe de caractères. Vous devez faire une barre oblique inverse pour échapper ces caractères, avec la barre oblique inverse elle-même, en utilisant une chaîne de remplacement.

special_symbols:= ',+-?'; 
special_group:= replace(replace(replace('\', '\\'), '-', '\-'), ']', '\]'); 
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_group+']*$') ... 
0

Merci pour votre réponse

j'ai le code ci-dessous FONCTION Validate_Inputstring_Func (input_String IN VARCHAR2) RETOUR EST BOOLEAN

special_symbols VARCHAR2 (300); BEGIN

special_symbols: = '+? @'; DBMS_OUTPUT.PUT_LINE ('La valeur enregistrée est NULL'); ELSE DBMS_OUTPUT.PUT_LINE ('La valeur Enetered est Not NULL' || input_String);

IF REGEXP_LIKE (input_String, '^ [A-z0-9A-z' + special_symbols + '] * $') ALORS DBMS_OUTPUT.PUT_LINE (​​'U sont entrés caractères alphanumériques --->' || input_String); RETURN false;

SINON DBMS_OUTPUT.PUT_LINE ('U N'a PAS entré de caractères alphanumériques ---->' || input_String); RETURN vrai; FIN SI; FIN SI;

END;

+0

il semble y avoir un IF..THEN manquant devant le premier appel à DBMS_OUTPUT. aussi, l'opérateur de concaténation est || pas +. –

1

bobince était sur la bonne voie, mais la syntaxe n'était pas tout à fait raison - l'opérateur de concaténation dans Oracle est ||, et il y avait une expression qui manque dans la remplacer() appelle ...

REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$') 

vous devez sortir de la chaîne pour interpoler vos symboles:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_symbols || ']*$') 

Cependant, il y a un peu d'un problème dans que vos symboles spéciaux peuvent aussi être particulière à l'expression rationnelle. Un '-' dans une classe [] -character-class fait une plage au lieu de littéralement '-'; un ']' mettrait prématurément fin à la classe de caractères. Vous devez faire une barre oblique inverse pour échapper ces caractères, avec la barre oblique inverse elle-même, en utilisant une chaîne de remplacement.

special_symbols:= ',+-?'; 
special_group:= replace(replace(replace(special_symbols, '\', '\\'), '-', '\-'), ']', '\]'); 
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_group || ']*$') ...