IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Concaténer au sein d'une regex [RegExp]


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut Concaténer au sein d'une regex
    Bonjour à tous,

    J'aurai besoin de concaténer des variables au sein d'une regex, mais quelque chose cloche et je ne vois pas quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var x =  /([a-z]*)\|/,
    debut =  /\{/,
    fin   =  /\}/;
     
    var pattern = new RegExp(debut+x+fin);
     
    value = value.replace(pattern,'$'+array[aleatoire]+' ');
    Quelqu'un aurait une idée?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    la syntaxe new RegExp() attend du string en paramètre ...
    pas une regex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var x =  "([a-z]*)|"
    debut =  "\{"
    fin   =  "\}";
     
    var pattern = new RegExp(debut+x+fin);
    par contre si tu souhaites rester avec des regexp //

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var x =  /([a-z]*)/
    debut =  /{/
    fin   =  /}/;
     
    var pattern = new RegExp(debut.source +x.source+fin.source);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    la syntaxe new RegExp() attend du string en paramètre ...
    pas une regex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var x =  "([a-z]*)|"
    debut =  "\{"
    fin   =  "\}";
     
    var pattern = new RegExp(debut+x+fin);
    Merci, malheureusement ça ne résout pas mon problème...

    Peut être que je l'ai mal traduit mais je veux faire ce code qui fonctionne sans RegExp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = value.replace(/\{([a-z]*)\|([a-z]*)\|([a-z]*)\}/,'$'+array[aleatoire]+' ');
    Mais comme on le voit le "([a-z]*)\|" se répète et j'ai besoin de le mettre dans une variable...

    Une autre idée?

    Merci encore.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var x =  "([a-z]*)"
    debut =  "\{"
    fin   =  "\}";
     
    mid=new Array();
    for(i=0;i<3;i==){
    mid.push(x);
    mid=mid.join('|')
    var pattern = new RegExp(debut+mid+fin);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Rah quand ça ne veut pas ça ne veut pas...

    Mais même en essayant comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var pattern = new RegExp("\{([a-z]*)\|([a-z]*)\|([a-z]*)\}");
     
    value = value.replace((pattern),'$'+array[aleatoire]+' ');
    Ça ne marche pas... bizarre, non ? Ou c'est normal et j'ai loupé quelque chose ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    tu peux donner un exemple de ce que tu cherches a remplacer, genre avant / après ...
    parce que j'avoue que c'est flou pour moi là
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    C'est pour un jeu qui s'administre en écrivant quelque chose comme ceci :
    "Voici votre quête : vous devez {affronter|manger|porter}
    un {asticot|dragon|tortue}"
    Et une phrase se construit par exemple comme "vous devez affronter un asticot" au final. Seulement je ne peux pas prévoir à l'avance combien de mots les utilisateurs vont rentrer et j'ai besoin d'utiliser une variable pour remplacer le "([a-z]*)\|":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = value.replace(/\{([a-z]*)\|([a-z]*)\|([a-z]*)\}/,'$'+array[aleatoire]+' ');
    Mais impossible avec RegExp, je ne comprends pas pourquoi...

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    {affronter|manger|porter}
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var chaine="vous devez {affronter|manger|porter}"
    reg=/\{([a-z]+\|?)+\}/
     
    alert(chaine.replace(reg,"{autre|autre|autre}"))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Ca ne fonctionne pas avec RegExp parce que, pour simuler un caractère d'échappement d'expression régulière dans un String, il faut doubler le caractère d'échappement.

    Du coup en l'écrivant comme ça, ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var x =  "([a-z]*)\\|"
    debut =  "\\{"
    fin   =  "\\}";
     
    var pattern = new RegExp(debut+x+fin);

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    {affronter|manger|porter}
    =>
    Oui merci mais comme je disais je n'ai pas de problème avec ces exemples précis..

    Tout le truc c'est de faire une fonction avec argument sinon ça n'a pas vraiment d'intêret

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    j'ai mis un exemple au dessus ...

    je en vois pas ce qu'il te faut de plus ?


    a moins que tu ne veuilles automatiser le remplacement masi il va falloir un fonction callback
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Citation Envoyé par Loceka Voir le message
    Ca ne fonctionne pas avec RegExp parce que, pour simuler un caractère d'échappement d'expression régulière dans un String, il faut doubler le caractère d'échappement.

    Du coup en l'écrivant comme ça, ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var x =  "([a-z]*)\\|"
    debut =  "\\{"
    fin   =  "\\}";
     
    var pattern = new RegExp(debut+x+fin);
    Hélas non toujours pas...

    Oublions les variables pour le moment déjà je n'arrive pas à faire fonctionner l'objet RegExp.
    Même en essayant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var pattern = new RegExp("\{([a-z]*)\|([a-z]*)\|([a-z]*)\}");
     
     
    				value = value.replace(pattern,'$'+array[aleatoire]+' ');
    ou comme ceci dans RegExp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("\\{([a-z]*)\\|([a-z]*)\\|([a-z]*)\\}")
    @spacefrog : Oui je souhaite l'automatiser, c'était justement ma question initiale d'utiliser des variables au sein de la regex

  13. #13
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    tu veux modifier les verbes ?
    tu as un array d'action ?

    c'est réalisable avec une fonction callbalck dans le replace
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    tu veux modifier les verbes ?
    tu as un array d'action ?

    c'est réalisable avec une fonction callbalck dans le replace
    Non en fait je voulais juster que le script choississe un mot au pif. Pour reprendre mon exemple ca donnerai : Votre quête : vous devez affronter un asticot

    Du coup je voyais quelque chose comme ça moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    function rand(min, max, integer) {
              if (!integer) {
                  return Math.random() * (max - min) + min;
              } else {
                  return Math.floor(Math.random() * (max - min + 1) + min);
              }  
          }
     
    	$bouton.click(function() {
     
    		function preview() {			
    			var	value = document.getElementById('prepare').value;
     
    			function arrayUnset(array, value){
       				array.splice(array.indexOf(value), 1);
    			}						
    					/*for(var i = array.length ; 0 < array.length ;i--) {
     
    						var aleatoire = (rand(0, array.length, true));
    					 		alert(array+' '+array.length);	
     
    						 arrayUnset(array2,array2[aleatoire]);		
    					}*/
     
    				var resultArray;
     
    				resultArray = value.match(/\{([a-z]*\|[a-z]*)*\}/g),
    				resultArrayLength = resultArray.length;
     
     
     
    			var array 	   = [],
    				arrayLength=array.length;;
     
    			for (var i = 0 ; i <resultArrayLength ; i++) {
    				alert(i)	
    				array.push(i);
     
    				var aleatoire = (rand(0, arrayLength, true));				
    				value = value.replace(/\{([a-z]*)\|([a-z]*)\|([a-z]*)\}/,'$'+array[aleatoire]+' ');				
    			}
     
    		  if(resultArray){
    			$div.html(value);
    		  }else{
    			  $div.html(value);
    		  }
    		}
     
    			 preview()		
    	})
    C'est pour ça il me manquais juste a mettre mes regex en variable et après une boucle et c'est good.

  15. #15
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Je viens de tester ça et ça marche très bien chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var reg = new RegExp("\\{([a-z]*)\\|([a-z]*)\\|([a-z]*)\\}");
    var s = "vous devez {affronter|manger|porter}";
    alert(s.replace(reg, '<<<test>>>'));
    Si ça fonctionne chez toi aussi (ce dont je ne doûte pas), il suffit de l'adapter ensuite pour que ça colle à ce que tu veux faire.

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut
    Oui en effet, super. Je ne sais pas ce que j'ai fait comme erreur toute à l'heure.
    Je devrais pouvoir me débrouiller avec ça maintenant.
    Merci bien.

  17. #17
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tabactions=["affronter","manger","porter"]
    var chaine="vous devez {actions} un asticot"
    reg=/\{actions}/
     
    alert(chaine.replace(reg, function(){ idx= Math.floor(Math.random()*3,10);return tabactions[idx];} ))

    ou si tu veux directement chopper l'array dans la chaine façon BBCode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tabactions=["affronter","manger","porter"]
    var chaine="vous devez {affronter|manger|porter} un asticot"
    reg=/\{([a-z]+\|?)+\}/
     
    alert(chaine.replace(reg, function(m,t){ tab=m.match(/[a-z]+/g);
    												tl=tab.length;
                                             idx= Math.floor(Math.random()*tl);
                                             return tab[idx]; } ))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  18. #18
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    et pour plusieurs replace au sein du même texte ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var chaine="vous devez {affronter|manger|porter} un asticot et le {vomir|digerer|macher} après."
    reg=/\{([a-z]+\|?)+\}/g
     
    alert(chaine.replace(reg, function(m,t){ tab=m.match(/[a-z]+/g);
    					tl=tab.length;
                                             idx= Math.floor(Math.random()*tl);
                                             return tab[idx]; } ))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténation au sein d'une même feuille Excel
    Par stephaneparis dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2009, 19h35
  2. concaténation en vba dans une formule de cellule Excel
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 22h58
  3. concaténer un type char à une chaine
    Par Fabs dans le forum C
    Réponses: 8
    Dernier message: 11/11/2005, 15h21
  4. [RegEx] spliter par rapport a une regex en récuperant la regex
    Par Khrysby dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2005, 15h08
  5. Concaténation et format dans une requête
    Par kinaros dans le forum Access
    Réponses: 4
    Dernier message: 10/09/2005, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo