2009-10-13 6 views
1

Je suis en train de trouver une expression régulière et ai quelques questions. Ce que je veux trouver (correspondre) est tous les paramètres SQL dans un grand fichier de script, mais ne correspondent pas aux éléments entre guillemets simples (tels que les adresses e-mail). Par exemple:RegEx pour ne correspond pas à des articles dans une citation

INSERT INTO [User] 
(
    [UserGuid], [CompanyGuid], [Name], [EmailAddress] 
) VALUES (
    @UserGuid1, @CompanyGuid, 'Jason', '[email protected]' 
) 

Avec @UserGuid1 et @CompanyGuid correspondant, mais pas correspondant @ Jason. J'utilise ce RegEx:

(@+[\w]+) 

Mais il correspond à l'adresse e-mail, donc j'ai essayé de faire un regard négatif comme avant/derrière ceci:

(?<!')[\W](@+[\w]+)[\W](?!') 

mais il est correspondant à la « (» dans l'exemple suivant:

INSERT INTO [User] ([UserGuid]) VALUES (@UserGuid1) 

Quelqu'un a une idée de ce que je manque quelque chose ici qui peut dire: « ? tout ce qui est pas dans un ensemble de devis » en outre, il est raisonnable de supposer des ensembles de devis équilibrés..

Répondre

2

avez-vous essayez ce qui suit?

(?<=\W)(@\w+) 

fondamentalement, il fait en sorte que la valeur capturée précédée d'un caractère non-mot, vous pouvez ajouter trop d'anticipation, mais il est un peu redondant, car + est avide et correspondra jusqu'à ce que non mot de toute façon.

ce qui suit assurera que INSERT INTO [User] ([UserGuid]) VALUES ('@UserGuid1') rien ne correspond:

(?<![\w'])(@\w+) 
+0

Je ne pense pas que cela fonctionne, car il n'y a pas d'espace avant le paramètre dans le second exemple de texte. –

+0

fixé dès maintenant (overenginneering engendre la frustration des utilisateurs, jeff) – SilentGhost

+1

OK, qui semble fonctionner, mais il correspondra à des articles comme « @something » qui ne sont pas les adresses e-mail, mais sont entrées citées. Ajout des lookahead/behinds pour les citations contribuerait, comme suit: '(@ \ w +) (?!) –

1

(@ + [^ '] +) devrait aider. Le [^ ',] correspondra à tout sauf à un seul guillemet, espace ou virgule. Vous devrez peut-être ajouter quelques caractères de plus, mais c'est l'idée générale.

1

Essayez ceci:

(?<=[^\w'])(@\w+)(?!')

Ceci indique que chaque match doit être précédée d'un caractère non-mot (à l'exception pour les guillemets simples), avoir alors un signe @ et un mot, et non suivi d'un autre guillemet simple.

+0

ouais, c'est exactement ce que mon commentaire a dit – SilentGhost

+1

Je ne suis pas sur le point d'entrer dans un argument internet, mais si vous le testez, vous verrez que j'ai raison. J'utilise ce testeur: http://www.gskinner.com/RegExr/ –

+0

Je ne dis pas que vous avez tort, je dis que effectivement la même chose a été affichée dans le commentaire avant votre répondre. En outre, OP écrit que * il est sûr de supposer des ensembles de devis équilibrés *, de sorte que la vérification anticipée est à nouveau redondante. – SilentGhost

Questions connexes