2009-07-09 2 views
0

champs et les types de données que j'ai cette déclaration sql:Regex pour extraire de l'instruction SQL

CREATE TABLE [dbo].[User]([UserId] [int] IDENTITY(1,1) NOT NULL, 

[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] 

[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A 

Ce que je veux est le code regex que je peux utiliser pour obtenir tous les champs et le type de données.

Donc retournera quelque chose comme ça:

FirstName varchar

MiddleName varchar

Notes: L'instruction SQL aura toujours ce format. J'utilise .Net pour exécuter cette regex

Répondre

1

Vous n'avez pas mentionné si l'instruction SQL se trouve dans une chaîne sur une ligne ou si elle s'étend sur plusieurs lignes.

En supposant qu'il est sur une ligne, cela peut s'adapter à votre demande:

Dim input As String = "CREATE TABLE [dbo].[User]([UserId] [int] IDENTITY(1,1) NOT NULL, " & _ 
        "[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] " & _ 
        "[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A" 

For Each m As Match In Regex.Matches(input, "\[(?<Field>\w+)\]\s*\[(?<Type>\w+)\]") 
    Console.WriteLine("{0} : {1}", m.Groups("Field").Value, m.Groups("Type").Value) 
Next 
0

Je ne sais rien .NET. Dans d'autres mondes, ce qui suit pourrait gérer la partie de recherche de l'opération:

\[(.*?)\][\s\n\r]+\[(.*?)\]\((\d\d)\) 

Insérer que dans le format « recherche » pour une regex .NET (quel qu'il soit), écrire vos trucs de sortie. Si les sauts de ligne peuvent se produire à mi-mot alors cela pourrait avoir des problèmes. Notez que ce qui précède tire également la longueur du type de sorte qu'il produirait

MiddleName varchar 50 

Pour faire sans le troisième backreference, il suffit de laisser de la REPLACE (perdue) ou faire

\[(.*?)\][\s\n\r]+\[(.*?)\]\(\d\d\) 

Beaucoup de bien façons de le faire. Comme d'habitude, assurez-vous de bien comprendre la variabilité potentielle de l'entrée.

Questions connexes