2010-05-06 7 views
0

Je tente de réduire une requête SQL via regex. Mon but est essentiellement de saisir ce qui est entre FROM et ORDER BY, si ORDER BY existe. Donc, par exemple pour la requête: SELECT * FROM TableA WHERE ColumnA=42 ORDER BY ColumnB il devrait capturer TableA WHERE ColumnA=42, et il devrait également capturer si l'expression ORDER BY n'est pas là.Exclusion d'une sous-chaîne spécifique d'une expression régulière

Le plus proche que j'ai pu venir est SELECT (.*) FROM (.*)(?=(ORDER BY)) qui échoue sans ORDER BY.

J'espère qu'il me manque quelque chose d'évident. J'ai martelé dans Expresso depuis une heure en essayant d'obtenir ceci.

Répondre

1

Je pense que vous cherchiez ceci:

^SELECT (.+) FROM (.+?)(ORDER BY (.+))?$ 

Notez que j'ai forcé les points de début et de fin de la chaîne. De cette façon, l'ordre optionnel par va être évalué, et s'il n'est pas présent, le reste du code va être inclus dans le deuxième groupe de correspondance.

P.S. vous pouvez bien sûr l'éditer comme vous voulez. J'ai mis le dernier .+ dans un groupe, de sorte que vous puissiez facilement accéder à la commande par params .. si vous n'en avez pas besoin - vous pouvez les supprimer: P avec le premier dans le SELECT, mais je suppose que vous le savez déjà :)

+0

Cela a fonctionné avec une petite modification (déplacer l'espace entre la deuxième expression de capture et l'ordre par capture dans l'ordre par capture.Merci beaucoup –

+0

Vous êtes très bienvenu, et oui, vous avez raison .. Je genre de raté celui-là: D mettra à jour la réponse (si je peux) avec elle) –

0

Vous devez faire le sous-expression, y compris la clause ORDER BY facultative, en mettant un ? après:

SELECT (.*) FROM (.*?) (ORDER BY (.*))?$ 

Vous devez également le modèle après FROM être un match non avide .*?, sinon que consommerait toujours le ORDER BY, et la partie finale ne correspondrait jamais.

+0

Cela échoue sur l'exemple de requête répertorié dans la question. Il ne capture que le premier mot après le FROM. –

+0

Ah, oui, j'avais besoin d'ancrer la fin de la RE pour m'assurer qu'elle ramassait toute la ligne. Fixé. –

0

Il suffit d'ajouter une modification à votre regex:

SELECT (.*) FROM (.*)(?=(ORDER BY|\Z|$))

0

Pourriez-vous ajouter juste "ORDER BY" à la chaîne avant d'appliquer la regex? C'est un peu un hack, mais ça devrait marcher.

+0

La commande par est déjà sur la chaîne. Je cherche à capturer ce qui est entre le FROM et ORDER BY, s'il existe –

+0

Mais la question dit, "il devrait également capturer si l'expression ORDER BY n'est pas là." En le forçant à être là, vous pouvez simplifier l'expression régulière. –

Questions connexes