2011-11-16 2 views
0

Je veux remplacer une chaîne de requête comme ceci:Substituer aux Regexp ne fonctionne pas

SELECT abc,def,ghi,jhk FROM table.... 

avec

SELECT X FROM table.... 

cela devrait être assez facile et je reçois le regexp remplacer au travail comme prévu, mais Je ne peux pas obtenir mon expression juste. C'est ce que j'ai:

rgx = new Regex("SELECT*.FROM"); 
data = rgx.Replace(data, "SELECT X FROM"); 

Il ne fonctionne pas dans l'évaluateur en ligne j'ai essayé, mais je n'ai aucune idée de comment il doit être alors. Et comment puis-je obtenir un modificateur là-bas? Je pense que ça devrait être ungreedy.

Je sais que tout cela peut sembler inutile, mais c'est exactement ce que je veux et que je dois faire.

Répondre

4

Vous mélangé le * et .

vous pouvez également ajouter quelques espaces là-dedans, sinon l'expression régulière serait également correspondre SELECTFOOBARFROM. De plus (en supposant que les expressions rationnelles de C# supportent la non-gourmandise), je rendrais le caractère générique non-gourmand par l'intermédiaire d'un ?.
Votre regex est maintenant gourmande. En conséquence votre regex actuelle changerait ceci:

SELECT Foo FROM Bar WHERE Baz IN (SELECT FooID FROM Bar WHERE Foo = 'Foo') 

dans ce:

SELECT X FROM Bar WHERE Foo = 'Foo') 

alors que le résultat correct aurait été ceci:

SELECT X FROM Bar WHERE Baz IN (SELECT X FROM Bar WHERE Foo = 'Foo') 

Ergo, rendez-vous avec ceci:

rgx = new Regex("SELECT .*? FROM"); 
+0

oui pensait qu'il devrait être ungreedy juste ne savait pas comment le faire :) Merci – Flo

+0

+ 1pour une analyse très approfondie (et la bonne réponse bien sûr). :) – Chris

1

Vous voulez:

rgx = new Regex("SELECT.*FROM"); 

Notez l'ordre du. et le *. Le * est fondamentalement un modificateur pour n'importe quel caractère ou groupe, donc dans le vôtre, vous correspondiez à 0 ou plus de la lettre T au lieu de 0 ou plus de n'importe quel caractère.

+0

merci, pour la réponse rapide, fonctionne bien :) acceptera en 12 – Flo

Questions connexes