Regexp pour remplacer les numero par des char
Résolu/Fermé
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
-
24 déc. 2009 à 17:59
devMan Messages postés 74 Date d'inscription jeudi 10 décembre 2009 Statut Membre Dernière intervention 16 septembre 2010 - 30 déc. 2009 à 17:51
devMan Messages postés 74 Date d'inscription jeudi 10 décembre 2009 Statut Membre Dernière intervention 16 septembre 2010 - 30 déc. 2009 à 17:51
A voir également:
- Regexp pour remplacer les numero par des char
- Remplacer disque dur par ssd - Guide
- Numero prive - Guide
- Numéro père noël whatsapp - Accueil - Messagerie instantanée
- Remplacer par word - Guide
- Quel site pour remplacer coco - Accueil - Réseaux sociaux
12 réponses
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
28 déc. 2009 à 17:13
28 déc. 2009 à 17:13
Bonjour,
j'ai pensé d'utiliser les parenthese non capturantes
mais toujour ça marche pas.
merci de m'aider
j'ai pensé d'utiliser les parenthese non capturantes
$reg="#(\(){0,1}\s*$nombre\s*(?:and|or|\))#i"
mais toujour ça marche pas.
merci de m'aider
Salut,
Je pense que tu dois utiliser les test avant/arrière
https://forums.commentcamarche.net/forum/affich-13586500-regexp-comment-interdire-une-chaine#3
Je pense que tu dois utiliser les test avant/arrière
https://forums.commentcamarche.net/forum/affich-13586500-regexp-comment-interdire-une-chaine#3
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
28 déc. 2009 à 18:36
28 déc. 2009 à 18:36
Salut,
merci pout votre reponse,
j'ai essayé avec :
mais j'ai un message d'erreur :
merci pout votre reponse,
j'ai essayé avec :
$reg="#(?<=(\())\s*($orderCritere)\s*(?=(and|or))#i";
mais j'ai un message d'erreur :
.....Compilation failed: lookbehind assertion is not fixed length at offset....
Re,
Tu testes comment ta variable.
Que contient $OrdreCritere ?
Donne ici un bout de code pour que je puisse tester.
Tu testes comment ta variable.
Que contient $OrdreCritere ?
Donne ici un bout de code pour que je puisse tester.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
29 déc. 2009 à 09:42
29 déc. 2009 à 09:42
Re,
en fait $OrdreCritere c'est la position de la numéro dans maChaine = (1 and 2) or 3..
je veux remplacer les numero par des chaines de caracteres qui peuvent contient des numeros et pour faire la differences entre les numero de maChaine et les autres numero j'ai fait ces regexp..
en fait $OrdreCritere c'est la position de la numéro dans maChaine = (1 and 2) or 3..
foreach ($listeObject as $object) { $orderCritere = $object->getOrder(); //pr le premiere chiffre if ($orderCritere == 1) { $reg="#(?<=(\({0,1}))\s*($orderCritere)\s*(?=(and|or))#i"; //pr le dernier chiffre } elseif ($orderCritere == count($listeObject)) { $reg="#(and|or|\))\s*($orderCritere)\s*((\)){0,1})#i"; //pr ts les autre chiffre sauf premier et dernier } else { $reg="#(and|or|\(|\))\s*($orderCritere)\s*(and|or|\))#i"; } }
je veux remplacer les numero par des chaines de caracteres qui peuvent contient des numeros et pour faire la differences entre les numero de maChaine et les autres numero j'ai fait ces regexp..
Salut,
je veux remplacer les numero par des chaines de caracteres qui peuvent contient des numeros et pour faire la differences entre les numero de maChaine et les autres numero j'ai fait ces regexp..
Ca je l'ai compris, mais tu ne me donne pas ce que je t'ai demandé.
C'est quoi c'est chaînes de remplacement?
Tu ne peux pas donner une exemple tout court
$chaine="......"
$chaine_de_remplacement="....."
$reg="......"
et ensuite le teste de ta regex avec la chaîne ?
La syntaxe de ta regex est correcte, enfin j'ai testé sur Perl (tu n'as pas dit quel language tu utilises, je suppose php, mais comme la syntaxe de php rassemble à perl, je ne sais pas)
je veux remplacer les numero par des chaines de caracteres qui peuvent contient des numeros et pour faire la differences entre les numero de maChaine et les autres numero j'ai fait ces regexp..
Ca je l'ai compris, mais tu ne me donne pas ce que je t'ai demandé.
C'est quoi c'est chaînes de remplacement?
Tu ne peux pas donner une exemple tout court
$chaine="......"
$chaine_de_remplacement="....."
$reg="......"
et ensuite le teste de ta regex avec la chaîne ?
La syntaxe de ta regex est correcte, enfin j'ai testé sur Perl (tu n'as pas dit quel language tu utilises, je suppose php, mais comme la syntaxe de php rassemble à perl, je ne sais pas)
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
29 déc. 2009 à 10:27
29 déc. 2009 à 10:27
Salut,
merci de votre reponse
en fait ou moment de modification des categorie j'ai fait une bcle sur liste des critereRecherche du categorie pour recuperer les articles correspondants a ces critere et les affecter a cette categorie..
pour chaque critere j'ai une chaine comme cella :
puis j'ai une champs ds ma base rechercheAvance dans cette champs je peux tapper quelque chose commme ça :
(1 and 2) or 3 ou bien 1 and (2 or 3) ou bien d'autre forme....
je veux remplacer les numero par $chaine_de_remplacement
et por le remplacement j'utilise :
merci de votre reponse
en fait ou moment de modification des categorie j'ai fait une bcle sur liste des critereRecherche du categorie pour recuperer les articles correspondants a ces critere et les affecter a cette categorie..
pour chaque critere j'ai une chaine comme cella :
$chaine_de_remplacement ="(Article.nom= "chamise17" AND Article.color = "rouge")
puis j'ai une champs ds ma base rechercheAvance dans cette champs je peux tapper quelque chose commme ça :
(1 and 2) or 3 ou bien 1 and (2 or 3) ou bien d'autre forme....
je veux remplacer les numero par $chaine_de_remplacement
et por le remplacement j'utilise :
rechercheAvance = preg_replace($reg, $chaine_de_remplacement, $rechercheAvance);
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
29 déc. 2009 à 11:25
29 déc. 2009 à 11:25
Bonjour,
À problème mal expliqué, réponse difficile. Depuis que j'ai vu ta question l'autre jour, je n'ai pas réussi à comprendre ce que tu veux.
Et maintenant , qu'est ce que c'est ce code
Il est destiné à faire quoi ?
Il n'y a normalement pas à écrire plusieurs RE en fonction du résultat de tests, on ne doit en arriver là à mon avis que pour des recherches extrêmement complexes, ce qui n'est pas le cas de ton problème.
Je ne connais pas PHP. Que fait :
Je me demande si ton problème est bien situé au niveau d'une regex et s'il n'est pas plutôt ai niveau de l'algorithme global.
Ce serait bien de nous expliquer ce que tu cherches à faire globalement.
Quand tu écris
je ne comprends rien.
C'est quoi ces catégories ?
C'est quoi critereRecherche ?
recuperer les articles, les affecter a cette categorie : ??!
puis j'ai une champs ds ma base rechercheAvance dans cette champs je peux tapper quelque chose commme ça
Alors ton programme est interactif ?
Prenons un cas précis; si tu tapes 1 and (2 or 3)
dans le «champ de ta base rechercheAvance» , tu vas remplacer 1 par quoi ? 2 par quoi ? 3 par quoi ?
Tu ne peux pas remplacer en même temps 1 et 2 et 3 par 3 chaînes, différentes les unes des autres.
Je crois qu'il y a une possibilité, mais il faut faire intervenir une fonction dans l'expression du remplacement. Je vais regarder ça en attendant tes explications.
À problème mal expliqué, réponse difficile. Depuis que j'ai vu ta question l'autre jour, je n'ai pas réussi à comprendre ce que tu veux.
Et maintenant , qu'est ce que c'est ce code
foreach ($listeObject as $object) etc ?
Il est destiné à faire quoi ?
Il n'y a normalement pas à écrire plusieurs RE en fonction du résultat de tests, on ne doit en arriver là à mon avis que pour des recherches extrêmement complexes, ce qui n'est pas le cas de ton problème.
Je ne connais pas PHP. Que fait :
#orderCritere = $object -> getOrder(); ?
Je me demande si ton problème est bien situé au niveau d'une regex et s'il n'est pas plutôt ai niveau de l'algorithme global.
Ce serait bien de nous expliquer ce que tu cherches à faire globalement.
Quand tu écris
en fait ou moment de modification des categorie j'ai fait une bcle sur liste des critereRecherche du categorie pour recuperer les articles correspondants a ces critere et les affecter a cette categorie..
je ne comprends rien.
C'est quoi ces catégories ?
C'est quoi critereRecherche ?
recuperer les articles, les affecter a cette categorie : ??!
puis j'ai une champs ds ma base rechercheAvance dans cette champs je peux tapper quelque chose commme ça
Alors ton programme est interactif ?
Prenons un cas précis; si tu tapes 1 and (2 or 3)
dans le «champ de ta base rechercheAvance» , tu vas remplacer 1 par quoi ? 2 par quoi ? 3 par quoi ?
Tu ne peux pas remplacer en même temps 1 et 2 et 3 par 3 chaînes, différentes les unes des autres.
Je crois qu'il y a une possibilité, mais il faut faire intervenir une fonction dans l'expression du remplacement. Je vais regarder ça en attendant tes explications.
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
29 déc. 2009 à 11:51
29 déc. 2009 à 11:51
Dans (?<=(\({0,1}))
il n'est pas nécessaire d'entourer de parenthèses le motif qui est testé en amont, l'écriture suivante suffit,du moins en Python , langage dans lequel je pratique les regex:
(?<=\({0,1})
De plus, il n'est pas nécessaire de mettre l'anti-slash devant ( , car à cette position la parenthèse ( ne peut pas avoir de signification spéciale. La parenthèse ) en nécessiterait un parce qu'elle signifierait "fermeture de la parenthès ouverte en amont", mais ici ( ne peut rien signifier d'autre qu'elle même.
Donc (?<=({0,1})
Mais de toutes façons, cette écriture n'est pas utilisable car les look ahead assertions ne peuvent pas être de longueur non fixée.
Du moins est-ce le cas en Python. Mais comme Python n'a pas toute la puissance des regex dans d'autres langages, il se pourrait qu'en PHP, cette écriture de look ahead assertion soit possible. À voir.
il n'est pas nécessaire d'entourer de parenthèses le motif qui est testé en amont, l'écriture suivante suffit,du moins en Python , langage dans lequel je pratique les regex:
(?<=\({0,1})
De plus, il n'est pas nécessaire de mettre l'anti-slash devant ( , car à cette position la parenthèse ( ne peut pas avoir de signification spéciale. La parenthèse ) en nécessiterait un parce qu'elle signifierait "fermeture de la parenthès ouverte en amont", mais ici ( ne peut rien signifier d'autre qu'elle même.
Donc (?<=({0,1})
Mais de toutes façons, cette écriture n'est pas utilisable car les look ahead assertions ne peuvent pas être de longueur non fixée.
Du moins est-ce le cas en Python. Mais comme Python n'a pas toute la puissance des regex dans d'autres langages, il se pourrait qu'en PHP, cette écriture de look ahead assertion soit possible. À voir.
Re,
merci de votre reponse,
j'ai trouvé semi solution :
mais lorsque je mets {0,1} ça marche pas ...
je veux dire que le numero doit etre precedé soit par 0 et 1 parenthses ouverte "("
merci de votre reponse,
j'ai trouvé semi solution :
$reg="#(?<=\({0,1})($orderCritere)(?=and|or)#i";
mais lorsque je mets {0,1} ça marche pas ...
je veux dire que le numero doit etre precedé soit par 0 et 1 parenthses ouverte "("
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
29 déc. 2009 à 16:01
29 déc. 2009 à 16:01
Ce que j'ai écrit à propos de (?<=(\({0,1})) est une information périphérique. Cela ne prétend pas apporter quelque chose directement pour la solution.
D'ailleurs, il y a quelque chose de faux: l'anti slash \ est nécessaire devant la seconde parenthès ouvrante
(?<=\({0,1})
Je ne comprends pas bien pourquoi il le faut ici, alors que je crois que j'avais remarqué qu'il n'est pas utile dans d'autres cas. Peut être est-ce parce qu'on est dans un look behind assertion ici.
---------------------------------------
Tant que tu n'expliqueras pas ton problème de façon plus claire et structurée, on aura du mal à t'aider. En tous cas, moi je n'ai encore pas compris grand chose, je ne comprends pas les circonvolutions que ton code semble comporter pour attraper des éléments simples dans une chaîne.
De plus, dans le peu que je comprends, j'ai l'impression que tu ne présentes pas deux fois la même chose pour ce que tu veux obtenir.
Dans le premier message tu écris:
tu cherches donc à détecter UN numéro.
Plus loin
Il faudrait te décider: c'est un ou plusieurs numéros que tu cherches à détecter ?
Pourtant, une fois qu'un problème est bien établi, une RE peut être écrite en 2 coups de cuiller à pot.
Voici par exemple comment capturer les 3 nombres d'une chaîne ( 1 and 2 or 3) en Python:
donne un triplet ('1', '2', '3'). Il suffit ensuite de tester les éléments du triplet et agir en fonction des résultats.
Et s'il y a des parenthèses erratiques, pas la peine de look ahead et look behind assertions:
Ces codes sont en Python. Les RE y sont proches ou similaires à celles de PHP.
D'ailleurs, il y a quelque chose de faux: l'anti slash \ est nécessaire devant la seconde parenthès ouvrante
(?<=\({0,1})
Je ne comprends pas bien pourquoi il le faut ici, alors que je crois que j'avais remarqué qu'il n'est pas utile dans d'autres cas. Peut être est-ce parce qu'on est dans un look behind assertion ici.
---------------------------------------
Tant que tu n'expliqueras pas ton problème de façon plus claire et structurée, on aura du mal à t'aider. En tous cas, moi je n'ai encore pas compris grand chose, je ne comprends pas les circonvolutions que ton code semble comporter pour attraper des éléments simples dans une chaîne.
De plus, dans le peu que je comprends, j'ai l'impression que tu ne présentes pas deux fois la même chose pour ce que tu veux obtenir.
Dans le premier message tu écris:
a condition que le numero precedé par "(" et suive soit par AND ou bien OR ou bien ")"
tu cherches donc à détecter UN numéro.
Plus loin
je veux remplacer LES numero par $chaine_de_remplacement
Il faudrait te décider: c'est un ou plusieurs numéros que tu cherches à détecter ?
Pourtant, une fois qu'un problème est bien établi, une RE peut être écrite en 2 coups de cuiller à pot.
Voici par exemple comment capturer les 3 nombres d'une chaîne ( 1 and 2 or 3) en Python:
import re ch = 'soleil (1 and 2 or 3) ocean ' pat = re.compile('\( ([123]) and ([123]) or ([123])\)') print pat.search(ch).groups()
donne un triplet ('1', '2', '3'). Il suffit ensuite de tester les éléments du triplet et agir en fonction des résultats.
Et s'il y a des parenthèses erratiques, pas la peine de look ahead et look behind assertions:
import re pat = re.compile('\(?([123]) and \(?([123])\)? or ([123])\)?') print pat.search('soleil (1 and 2 or 3) ocean ').groups() print pat.search('soleil 1 and (2 or 3) ocean ').groups() print pat.search('soleil 1 and (2 or 3) ocean ').groups()
Ces codes sont en Python. Les RE y sont proches ou similaires à celles de PHP.
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
29 déc. 2009 à 17:35
29 déc. 2009 à 17:35
Re,
si j'ai un chaine = (1 and 2) or 3
en fait je veux remplacer LES numero par $chaine_de_remplacement
a condition que le numero precedé par "(" et suive soit par AND ou bien OR ou bien ")" pr le premiere numero c a dire (1)
par contre pr le derniere numero il doit etre precede par and|or et suivi par ")" ou rien
pr les autres numero il doit etre precede soit par and|or|\( et precede soit par and|or|\)
en fait j'ai fait ces condition pr faire une differences entre les chiffres de maChaine et les autres chiffres
si j'ai un chaine = (1 and 2) or 3
en fait je veux remplacer LES numero par $chaine_de_remplacement
a condition que le numero precedé par "(" et suive soit par AND ou bien OR ou bien ")" pr le premiere numero c a dire (1)
par contre pr le derniere numero il doit etre precede par and|or et suivi par ")" ou rien
pr les autres numero il doit etre precede soit par and|or|\( et precede soit par and|or|\)
en fait j'ai fait ces condition pr faire une differences entre les chiffres de maChaine et les autres chiffres
devMan
Messages postés
74
Date d'inscription
jeudi 10 décembre 2009
Statut
Membre
Dernière intervention
16 septembre 2010
15
30 déc. 2009 à 17:51
30 déc. 2009 à 17:51
Re,
j'ai essayé avec :
et il me semble ça marche
j'ai essayé avec :
$reg="#(?<=\(|)($orderCritere)(?=(and|or|))#i";
et il me semble ça marche