[Expression Régulière] Matcher les virgules qui ne sont pas protéger par des quotes

Tout est dans le titre, je recherche à remplacer toutes les virgules qui ne sont pas protéger par des quotes par des points virgules.
Je développe en VBA et utilise l’objet RegExp v5.5 fourni par défaut sous Windows 2000.

Je matte l’aide mais j’ai du mal à voir comment mettre en place l’idée : “pas compris entre”

Merci d’avance

[Edit]
Je viens de me rendre compte que ça va être plus difficile que je ne le pensais. Pour être un peu plus précis, je souhaite transformer la chaine suivante :

BLA,BLA,“alb,alb,alb”,BLA,BLA,“alb,alb”,BLA

par

BLA;BLA;alb,alb,alb;BLA;BLA;alb,alb;BLA

[quote=“ZGoblin, post:1, topic: 30626”]Tout est dans le titre, je recherche à remplacer toutes les virgules qui ne sont pas protéger par des quotes par des points virgules.
Je développe en VBA et utilise l’objet RegExp v5.5 fourni par défaut sous Windows 2000.

Je matte l’aide mais j’ai du mal à voir comment mettre en place l’idée : “pas compris entre”

Merci d’avance

[Edit]
Je viens de me rendre compte que ça va être plus difficile que je ne le pensais. Pour être un peu plus précis, je souhaite transformer la chaine suivante :

BLA,BLA,“alb,alb,alb”,BLA,BLA,“alb,alb”,BLA

par

BLA;BLA;alb,alb,alb;BLA;BLA;alb,alb;BLA[/quote]

un des solutions et de remplacer les , entre " par ¤ par exemple puis de remplacer toute les virgules restantes par ; puis ensuite les ¤ par des ,.

Bussiere
think different

C’est exactement, ce que je viens de faire Bussiere B) (avec le même caractères alacon© ¤) :

[codebox]
Public Function F_S_Transform(S_Texte As String)
Dim O_RegExp As RegExp
Dim O_RegExp2 As RegExp
Dim O_RegExp3 As RegExp

Set O_RegExp = New RegExp
Set O_RegExp2 = New RegExp
Set O_RegExp3 = New RegExp

O_RegExp.Pattern = “”"([^""]),([^""])"""
O_RegExp.IgnoreCase = True
O_RegExp.Global = True
O_RegExp2.Pattern = ","
O_RegExp2.IgnoreCase = True
O_RegExp2.Global = True
O_RegExp3.Pattern = "¤"
O_RegExp3.IgnoreCase = True
O_RegExp3.Global = True

F_S_Transform = S_Texte
F_S_Transform = O_RegExp.Replace(F_S_Transform, “$1¤$2”)
F_S_Transform = O_RegExp2.Replace(F_S_Transform, “;”)
F_S_Transform = O_RegExp3.Replace(F_S_Transform, “,”)

Set O_RegExp = Nothing
Set O_RegExp2 = Nothing
Set O_RegExp3 = Nothing
End Function
[/codebox]

Il faut que je fasse des tests de performances pour vérifier que ça ne bouffe pas trop de ressource sur un CSV de 10000 lignes.

Si quelqu’un a une autre idée, je suis toujours preneur car la solution précédante me pose problème pour la chaine suivante :

Allez, je joue aussi ( on gagne quoi au fait ? )

moi je dis :

[,"]+

testé sous http://www.regular-expressions.info/javascriptexample.html

( si j’ai bien compris le probleme )

[quote=“Monsieur_Max, post:4, topic: 30626”]Allez, je joue aussi ( on gagne quoi au fait ? )

moi je dis :

[,"]+[/quote]

Ouai, mais non B) Ton expression check tous les groupes de virgules et de guillements, moi ce que je recherche c’est de transformer un chaine de type :

[codebox]

O_RegExp.Pattern = “”"([^""])""""([^""])""""([^""])""“
O_RegExp4.Pattern = “””([^"",]
)""“
O_RegExp1.Pattern = “””([^""]),([^""])"""
O_RegExp2.Pattern = ","
O_RegExp3.Pattern = “¤”

F_S_Transform = S_Texte
F_S_Transform = O_RegExp.Replace(F_S_Transform, “$1 $2 $3”)
F_S_Transform = O_RegExp4.Replace(F_S_Transform, “$1”)
F_S_Transform = O_RegExp1.Replace(F_S_Transform, “$1¤$2”)
F_S_Transform = O_RegExp2.Replace(F_S_Transform, “;”)
F_S_Transform = O_RegExp3.Replace(F_S_Transform, “,”)
[/codebox]
J’espère que je n’ai oublié aucun cas

Ouais bon donc effectivement j’avais bien rien pigé !

( et c’est toujours le cas, alors on va en rester là )

Ce truc là a l’air de marcher, en tout cas j’ai pas trouvé de contre exemples:

([^",]),([^",])("[^"]*")?

à remplacer par

$1;$2$3

edit: ah non, m****, j’avais pas vu qu’il fallait aussi supprimer les guillemets…

J’y connais pas grand chose en prog mais bon j’essaye quand même :

Quand c’est entre ["] c’est du francais, donc théoriquement pas d’espace avant mais un après.
Sinon c’est du code donc les espaces sont différents ( un avant et après , ou pas du tout, la je séche)

donc chercher/remplacer un truc du genre " , " ou un truc du genre ", " devrait peut être les différencier.

C’est obligatoire les expressions régulières ?

Parce que sinon, pour le fun, en C (facilement portbale dans un autre langage) :

[code]#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char *str = “Bla,Bla,“TAT,TAT”,“Bla”“fsdqf”“fdsq”,“TAT,TAT””, *mem=(char *)malloc((strlen(str)+1)*sizeof(char)), *mem2 = mem;
int quote_found = 0;
char c, rempl=’;’;

	printf("%s\n", str);

	while(*str != '\0')
	{
			c = *str;
			str++;
			
			if(c == ',')
			{
				*mem = rempl;
				mem++;
				continue;
			}
			
			if(c == '\"')
			{
				quote_found++;
				
				if(quote_found == 1)
				{
					rempl = ',';
					continue;
				}
				
				if(quote_found == 2)
				{
					rempl = ';';
					quote_found = 0;
					continue;
				}
				
			}
			
			*mem = c;
			mem++;
	}
	
	*mem = '\0';
	
	printf("%s\n", mem2);

}[/code]

C’est plus long mais niveau perf, c’est pas dit que ce soit plus lent qu’une regexp.