Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Expression reguliere pour les mordus

10 réponses
Avatar
Philippe
Bonjour,

Je cherche une expression régulière à utiliser dans VIM ou dans un script
PHP ou Perl :

j'ai un fichier qui contient ces données par ligne :


ligne n : ....;10/12/2003;MOT1; MOT2; MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1; MOT2 ;M;....
.
.
.

je souhaiterai obtenir :

ligne n : ....;10/12/2003;MOT1 MOT2 MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1 MOT2;M;....
.
.
.

En fait je veux juste virer les points virgules qui se trouvent dans les
champs qui se trouvent exactement circonscrit entre un champ de type
XX/XX/XXXX
et un champ avec une seule lettre E ou M .
Petite précision, il ya d'autre champ du type XX/XX/XXXX dans la ligne avant
celui qui délimite la zone de texte recherché.
En fait :

ligne n : ....;10/12/2003;MOT1; MOT2; MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1 MOT2;M;....
^
c'est le 11ème point virgule de la ligne


Avis aux amateurs :)

Philippe

10 réponses

Avatar
Transat :O)
Philippe a ecrit avec 2 doigts
news:4124996e$0$29652$:

ligne n : ....;10/12/2003;MOT1; MOT2; MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1; MOT2 ;M;....
.
.
.

je souhaiterai obtenir :

ligne n : ....;10/12/2003;MOT1 MOT2 MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1 MOT2;M;....


En lisant cela, je vois:

- remplacement de "; " par " "
- remplacement de " ;" par ";"

la fonction "str_replace" ne peut pas fonctionner ?

Apres, si tu veux jouer sur la position, la fonction "substr_replace"
permet de definir la zone a controler.

a+

--
Transat :O)

Avatar
Kevin
Salut,

je ne pense pas que ca soit faisable en une seule RE

Kevin


--
Coders don't die... they just JMP without RET
Avatar
P'tit Marcel

ligne n : ....;10/12/2003;MOT1; MOT2; MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1; MOT2 ;M;....



je souhaiterai obtenir :
ligne n : ....;10/12/2003;MOT1 MOT2 MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1 MOT2;M;....

En fait je veux juste virer les points virgules qui se trouvent dans les
champs qui se trouvent exactement circonscrit entre un champ de type
XX/XX/XXXX et un champ avec une seule lettre E ou M .
Petite précision, il ya d'autre champ du type XX/XX/XXXX dans la ligne avant
celui qui délimite la zone de texte recherché.


en truandant un peu:

$masque='`^(.*[0-9]{2}/[0-9]{2}/[0-9]{4};)(.+)(;E;.*)$`U';
$resultat preg_replace_callback($masque, 'virpvirg' , $chaine);

function virpvirg($res) {
return $res[1] . strtr($res[2], ';' , ' ') . $res[3];
}


a+
--
P'tit Marcel

Avatar
Teufel
Bonjour,


Bonjour,

ligne n : ....;10/12/2003;MOT1; MOT2; MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1; MOT2 ;M;....
.
.
.

je souhaiterai obtenir :

ligne n : ....;10/12/2003;MOT1 MOT2 MOT3;E;....
ligne n+1 : ....;11/08/2004;MOT1 MOT2;M;....
.
.
.



Ou encore, une autre solution :

preg_replace("/([0-9]{2}/[0-9]{2}/[0-9]{4});(.+);(E|M);/e",
"'1;'.str_replace(';', '', '2').';3;'",
$txt);


A+

--
Teuf

Avatar
Philippe
- remplacement de "; " par " "
- remplacement de " ;" par ";"



Merci pour ta proposition, mais en fait il y a d'autres champs dans la
ligne, que je ne souhaite pas modifier,
et qui contiennent un espace avant et/ou après le point virgule :-(

Philippe

Avatar
Philippe
$masque='`^(.*[0-9]{2}/[0-9]{2}/[0-9]{4};)(.+)(;E;.*)$`U';


On y est presque à part le fait qu'il peut y avoir soit E soit M, le
problème est qu'il
prend le premier champ date qu'il rencontre depuis le début de la ligne or
il devrait
prendre le champ date qui se trouve juste après le 11ème point virgule...

Philippe

Avatar
Philippe
Ou encore, une autre solution :

preg_replace("/([0-9]{2}/[0-9]{2}/[0-9]{4});(.+);(E|M);/e",
"'1;'.str_replace(';', '', '2').';3;'",
$txt);


Même problème que la proposition précédente, il prend la première date qu'il
rencontre :-(


Philippe

Avatar
P'tit Marcel

il devrait prendre le champ date qui se trouve juste après le 11ème
point virgule...


il aurait peut être fallu commencer par le préciser... en gros, si (i)
est la position de la cellule "E", il faut fusionner les cellules de la
13° à la (i-1)°.


$masque='`^(.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;[0-9]{2}/[0-9]{2}/[0-9]{4};)(.+)(;E;.*)$`U';
ou
$masque='`^(.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;)(.+)(;E;.*)$`U';


cela dit, ton problème ne devrait pas se régler par expression
régulière. La chaine constitue une suite ordonnée d'éléments et la
solution est peut être du côté des fonctions de tableau :

$champs = explode(';', $ligne);
$indE = array_search('E', $champs);
for($i = 13 ; $i < $indE ; $i++) {
$champs[12] .= " ".$champs[$i];
unset($champs[$i]);
}
$ligne = implode(';', $champs);


un algo, c'est plus long à écrire mais plus simple à comprendre qu'une
expression régulière.


eça
--
P'tit Marcel

Avatar
Philippe
il aurait peut être fallu commencer par le préciser...


heu... désolé mais je l'avais précisé. Bon peut-être pas au début, mea culpa
:)

en gros, si (i)
est la position de la cellule "E", il faut fusionner les cellules de la
13° à la (i-1)°.


exact

$masque='`^(.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;)(.+)(;(E|M);.*)$`U';


parfait c'est exactement ça pas si compliqué finalement...

Merci beaucoup, j'aurai appris beaucoup sur les expressions régulières !

Philippe

Avatar
Dans news:4126032e$0$13693$,
P'tit Marcel a dit :

$masque='`^(.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;.*;)(.+)(;E;.*)$`U';


c'est quoi le U a la fin de $masque

--
ampac