2010-11-18 5 views

Répondre

5

Cela dépend de la structure de votre fichier. Essayez d'utiliser ceci:

(?<=from|join)(\s+\w+\b) 

tourner également sur les options Multiligne si vous n'êtes pas diviser votre fichier en tableau ou smth autre avec les membres de la chaîne SingleLine. Essayez également d'activer l'option IgnorCase.

+0

Je pense que vous devez déplacer le \ s + dans le lookbehind positif – pastacool

+0

oui. Bon conseil –

+1

-1 Regex n'est pas la bonne façon de résoudre ce problème. Comme l'indique tdammers, un analyseur SQL d'une certaine description est nécessaire pour résoudre efficacement ce problème. –

-1
(from|join)\s(\w+) 
+0

Non. Cela correspondra simplement à "from" ou à "join table_name", mais pas à "from table_name". Le tuyau sépare le motif entier, pas seulement la première partie. – tdammers

+0

Hmm. Alors, est-ce que je peux envelopper de | joindre avec n'importe quelle parenthèse ou quelque chose? – NLV

1

Quelque chose comme ça peut-être:

/(from|join)\s+(\w*\.)*(?<tablename>\w+)/ 

Il ne correspondront pas échappé les noms de tables bien, et vous devez faire le cas insensible à la casse d'évaluation des expressions régulières.

+0

Désolé. Il ne revient même pas un match. – NLV

+0

absolument faux. Vous ne pouvez pas trouver les noms de tables avec une telle regex. Vous allez faire correspondre les mots join et aussi. Pas seulement les noms de tables. –

+1

Je ne l'ai pas testé, mais il doit correspondre à chaque occurrence de 'from' ou 'join', suivi par au moins un espace, puis un ou plusieurs identifiants séparés par des points. Il y a une erreur cependant; il devrait commencer par une assertion de début de mot, sinon il correspondra aussi à des choses comme 'foobarfrom blah'. Et cela ne prend pas en compte l'évasion, parce que c'est une chose spécifique au SGBD - MySQL utilise des backquotes, PostgreSQL utilise des guillemets doubles, T-SQL utilise des crochets. – tdammers

2

J'utiliser:

r = new Regex("(from|join)\s+(?<table>\S+)", RegexOptions.IgnoreCase); 

une fois que vous avez l'objet Match "m", vous aurez le nom de la table avec

m.Groups["table"].Value 

exemple:

string line = @"select * from tb_name join tb_name2 ON a=b WHERE x=y"; 
Regex r = new Regex(@"(from|join)\s+(?<table>\S+)", 
     RegexOptions.IgnoreCase|RegexOptions.Compiled); 

Match m = r.Match(line); 
while (m.Success) { 
    Console.WriteLine (m.Groups["table"].Value); 
    m = m.NextMatch(); 
} 

il imprimera: tb_table tb_table2

+0

pour quoi est-ce

? – NLV

+0

absolument faux. Vous ne pouvez pas trouver les noms de table avec une telle regex –

+0

oui, j'ai oublié quelque chose. – Simone

Questions connexes