J'ai un fichier texte contenant un grand nombre de requêtes. Je veux obtenir toutes les tables distinctes utilisées dans le fichier entier dans toutes les requêtes. Le nom de la table peut venir après un 'from' ou 'join'. Comment puis-je les extraire en faisant un match regex. Quelqu'un peut-il suggérer une expression régulière pour obtenir les matchs?Utilisation de Regex pour extraire les noms de table d'un fichier contenant des requêtes SQL
Répondre
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.
(from|join)\s(\w+)
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.
Désolé. Il ne revient même pas un match. – NLV
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. –
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
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
pour quoi est-ce
Je pense que vous devez déplacer le \ s + dans le lookbehind positif – pastacool
oui. Bon conseil –
-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. –