2010-04-01 12 views
1

J'essaie d'isoler un champ spécifique dans un fichier de vidage SQL afin que je puisse l'éditer mais je n'ai pas de chance.Isoler le champ SQL en utilisant regex

Le regex J'utilise est:

^(?:(?:'[^\r\n']*'|[^,\r\n]*),){6}('[^\r\n']*'|[^,\r\n]*) 

qui est censé attraper le septième champ et le placer dans la référence 1.

Le problème est que ce trébuche quand jamais il trouve un virgule à l'intérieur d'un champ de texte et compte la correspondance partielle en tant que correspondances autorisées.

Par exemple. (1, 'Titre', 1, 3, '2006-09-29', 'Les virgules, le fléau de mon regex', 'Ceci est la cible', 2, 4) correspond au 'fléau de mon regex' " de "'C'est la cible'".

Répondre

0

Doh!

Mes champs n'étaient pas seulement séparés par une virgule. Ils ont été divisés avec une virgule suivie d'un espace.

est correcte RegEx

^(?:(?:'[^\r\n']*'|[^,\r\n]*),){6}('[^\r\n']*'|[^,\r\n]*) 

Maintenant, cela fonctionne.

Désolé de perdre votre temps avec celui-ci. C'était la réponse de Beta qui m'a fait réfléchir car c'était la deuxième alternance en jeu pour tous les domaines. L'espace supplémentaire l'a forcé à utiliser cette option plutôt que l'option placée entre guillemets.

4

Il peut être plus facile de charger le code SQL dans une base de données temporaire, puis d'effectuer un SELECT pour obtenir les données dans ce champ.

+0

Mais ce serait trop facile. ;) Vous avez raison. En fin de compte, j'ai utilisé une méthode différente pour faire ce que je devais faire, mais je ne peux pas comprendre ce que le RegEx ne fait pas ce qu'il devrait faire. – Das123

2

Avez-vous le contrôle du fichier de vidage ou sont-ils historiques ou hors de votre contrôle?

Si vous pouvez choisir un meilleur délimiteur, la virgule est vraiment un choix terrible.

+0

Oui, j'ai le contrôle et cela aurait simplifié les choses aussi. :) Je veux toujours savoir pourquoi le RegEx ne fonctionne pas bien. – Das123

0

Je pense que vous aurez plus de chance si vous faites l'expression régulière plus spécifique. Je n'ai pas testé cela, mais je crois que cela devrait fonctionner.

Aussi comme Paul suggère que vous pourriez essayer un délimiteur différent pour rendre cela plus facile.

Profitez-en!

\d{1,4}(,){1}('){1}[a-zA-Z0-9,]+('){1}\d{1,4}(,){1}\d{1,4}(,){1}('){1}[0-9-]+('){1}(,){1}('){1}[a-zA-Z0-9,]+('){1}(,){1}('){1}[a-zA-Z0-9,]+('){1}(,){1}\d{1,4}(,){1}\d{1,4}(\r\n){1} 
1

[^, \ r \ n] *, correspond

'Commas, 

Je suggère [^, \ r \ n '] *, au lieu.

Questions connexes