2010-06-21 6 views
0

J'essaie de noter regex pour trouver où j'utilise ltrim rtrim dans la clause where dans les procédures stockées.regex pour correspondre à RTRIM (LTRIM (xx)) = xx

le regex doit correspondre à des choses comme:

RTRIM(LTRIM(PGM_TYPE_CD))= 'P')) 

RTRIM(LTRIM(PGM_TYPE_CD))='P')) 

RTRIM(LTRIM(PGM_TYPE_CD)) = 'P')) 

RTRIM(LTRIM(PGM_TYPE_CD))= P 

RTRIM(LTRIM(PGM_TYPE_CD))= somethingelse)) 

etc ...

Je cherche quelque chose comme ...

.TRIM.*\)\s+ 

Répondre

0

Ce que vous voulez:

[LR]TRIM\([RL]TRIM\([^)]+\)\)\s*=\s*[^)]+\)* 

?

Qu'est-ce que cela dit:

[LR] # Match single char, either "L" or "R" 
TRIM # Match text "TRIM" 
\(  # Match an open parenthesis 
[RL] # Match single char, either "R" or "L" (same as [LR], but easier to see intent) 
TRIM # Match text "TRIM" 
\(  # Match an open parenthesis 
[^)]+ # Match one or more of anything that isn't closing parenthesis 
\)\) # Match two closing parentheses 
\s*  # Zero or more whitespace characters 
=  # Match "=" 
\s*  # Again, optional whitespace (not req unless next bit is captured) 
[^)]+ # Match one or more of anything that isn't closing parenthesis 
\)*  # Match zero or more closing parentheses. 


Si cela est automatisé et que vous voulez savoir quelles variables en elle, vous pouvez envelopper entre parenthèses autour des parties concernées:

[LR]TRIM\([RL]TRIM\(([^)]+)\)\)\s*=\s*([^)]+)\)* 

Ce qui vous donnera les première et deuxième variables dans les groupes 1 et 2 (soit \ 1 et \ 2 ou $ 1 et $ 2 selon la regex utilisée).

+0

c'est exactement ce que je cherchais. Je veux vraiment automatiser cela et trouver le nom de la table aussi !! mais je pense que ce sera long à parcourir les fichiers que je vais devoir lire à l'envers. Donc, je vais lancer une requête sur Oracle après avoir le nom de la colonne et trouver le nom de la table. Merci pour l'aide – jason

+0

Ouais, cela dépend s'il y a un moyen facile d'identifier de manière fiable tous les blocs de requête, puis d'exclure ceux qui ne correspondent pas à ce qui précède - je ne connais pas la syntaxe Oracle SP, mais je suppose territoire parseur pour ce genre de choses. –

1

[RL]TRIM\s*\( va chercher R ou L suivi par TRIM, un certain nombre d'espaces, puis un (

+0

c'est aussi sélectionner des choses comme 'select RTRIM (LRTRIM (....' Je ne veux que des trucs là j'utilise rtrim ltrim dans la clause 'WHERE' – jason

+0

J'ai modifié le vôtre pour être [RL] TRIM \ s * \ (. * \ s * = 'Je mince kthis suffira – jason

0

Que diriez-vous quelque chose comme ceci:

.*[RL]TRIM\s*\(\s*[RL]TRIM\s*\([^\)]*)\)\s*\)\s*=\s*(.*) 

Cette capture à l'intérieur de la garniture et le côté droit du = dans les groupes 1 et 2, et devrait gérer tous les espaces dans toutes les zones pertinentes.

Questions connexes