javascript:
var myRe = /ab*/g;
var str = "abbcdefabh";
var myArray;
while ((myArray = myRe.exec(str)) != null)
{
var msg = "Found " + myArray[0] + ". ";
msg += "Next match starts at " + myRe.lastIndex;
alert(msg);
}
Euh, je ne crois pas que c'est ce que je recherche :/
Je vais te donner un code, ce sera peut être plus compréhensible !
var production_table = document.getElementById('production_table');
var Regx = /(\(\d\d\d\|\d\d\d\)) (C\d\d)/;
var searchRegx = production_table.innerHTML.match(Regx);
var coords = searchRegx.$1;
var conts = searchRegx.$2;
var NbVill = production_table.innerHTML.match(/Village (\(\d\))/);
var input_one = production_table.getElementsByTagName('input');
for (var l = 0; l < input_one.length; l++) {
if (input_one[l].id.indexOf('edit_input') != -1) {
for (var j = 0; j < NbVill.$1; j++) {
input_one[l].value = coords[j];
}
}
};
Je cherche a capturer plusieurs chaines de caractères dans la page qui ont cette forme : (000|000)
ensuite, j'accède a des inputs de type texte pour remplacer leur valeur par la regexp !
Et ... ça ne fonctionne pas
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
1. Le caractère | en regex est une caractère spécial, donc si tu le veux en tant que chaine, tu dois mettre \|
2. Ensuite, donne moi un exemple de chaine de départ (càd production_table.innerHTML). Il n'y a qu'une fois (000|000) ou plusieurs fois ?
Le meilleur moyen pour accéder aux parenthèses «capturantes» d'une expression régulière consiste à utiliser la fonction replace avec une fonction anomyme. Par exemple, avec la date 2011-11-15 et l'expression régulière /(\d\d\d\d)-(\d\d)-(\d\d)/, on va pouvoir disposer en arguments de la fonction du motif capturé dans son intégralité, puis des 3 parenthèses «capturantes» suivantes...
var chnDte="nous sommes le 2011-11-15";
var chnEnClair=chnDte.replace(/(\d\d\d\d)-(\d\d)-(\d\d)/,function(a,b,c,d){
alert('le tout : '+a+'\nun : '+b+'\ndeux : '+c+'\ntrois : '+d)
return parseInt(d,10)+' '+'janvier,février,mars,avril,main,juin,juillet,août,septembre,octobre,novembre,décembre'.split(/,/g)[parseInt(c,10)-1]+' '+b;});
alert(chnEnClair);
La méthode est très pratique, elle peut même être détournée en ne retournant rien (pas de remplacement) mais en affectant des valeurs à des variables prédéfinies...
Je vous laisse le soin d'en tirer parti avec l'expression /(\(\d\d\d\|\d\d\d\)) (C\d\d)/;
Les a,b,c,d sont donnés par le système, un peu comme le e dans les «event listeners»... Voir cette page de MDN. Cela fonctionne sur tous les navigateurs récents.
Je ne comprend pas comment l'on déduit les numéros des inputs. Serait-ce simplement l'ordre des captures ?
Puis-je avoir un extrait du code dans lequel se trouvent les codes à extraire ?
Edit : le nombre des arguments dépend évidement du nombre de parenthèses «capturantes». le système donne même deux arguments supplémentaires (la position de la capture et la chaîne intégrale)
Sinon voila, sans détourner l'usage premier de replace.
Et je tiens à rappeler encore une fois :
1. Le signe | est un opérateur des RegEx, il faut donc l'échapper avec \
2. Les parenthèses étant également des opérateurs, si tu veux capturer les parenthèses, tu dois mettre (\(...\))
J'approche au but, merci a vous deux mais j'ai choisis le code de Tiller :
Ce n'est pas que je n'aime pas ton code 007Julien, mais je préfère utiliser ce que je comprends pour l'instant, plus tard je passerais a autre chose peut être
Et donc, j'ai dis J'approche car j'avais raison, les inputs contiennent seulement la première chaine retournée par la regexp !
Voici le code que j'ai modifié :
var production_table = document.getElementById('production_table');
var myRe = /(\(\d\d\d\|\d\d\d\)) (C\d\d)/,
page = production_table.innerHTML,
result = myRe.exec(page);
var inputs = production_table.getElementsByTagName('input');
for (var l = 0; l < inputs.length; l++) {
if (inputs[l].id.indexOf('edit_input') != -1) {
inputs[l].value = result[1]; /* (000|000) */
/*inputs[l].value = result[2]; // C00*/
}
};
void(0);
Sinon c'est parfait
Note : j'ai mis entre commentaires quelques ligne car c'est principalement la chaine (000|000) qui m'intéresse, une fois que j'aurais résolu le problème je passerais a C00
Note2 : je pourrais rallonger le code, en faisant, au premier click, un numérotage des inputs, ex :
001 (000|000) C00
002 (000|000) C00
et au second click, j'enlève les numéros
Vous allez vous dire "Mais si tu numérotes, il y a déjà les coordonnées ?"
et bien en faite les coordonnées ne sont pas dans la chaine mais a coté, donc ça reviendrais a remplir les inputs comme ceci :
001
002
Si on ne trouve pas de solution, je ferais la Note2, ce qui est dommage car ce cas peut être fréquent et la Note2 ne sera pas toujours applicable
(quand je dis "ce cas", je fais allusion a la recherche de chaine dans une page au moyen d'une regexp, et donc retourner par exemple dans des inputs les résultats trouvés 1 par 1)
Merci !!
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Alors, étant absolument persuadé de la validité de mon code et de la non validité du tien, j'ai testé mon code, et effectivement il y a le bug que tu as dit, et je m'en excuse :]
Cependant, ce n'est pas la logique qui est fausse loin de là. C'était seulement une petite lettre "g" oubliée après la regex.
Je le redis pour la n-ième fois :
Tu n'as pas accès aux parenthèses capturantes de chaque correspondance avec match. Tu dois faire une boucle avec exec~
Extrait de l'aide javascript
Match , méthode
Renvoie, sous forme de tableau, les résultats d'une recherche sur une chaîne au moyen d'un objet Regular Expression qui lui est fourni.
La méthode match, qui se comporte comme la méthode exec, renvoie un tableau de valeurs. L'élément zéro du tableau contient les derniers caractères retenus. Les éléments 1...n contiennent les correspondances des sous-chaînes entre parenthèses dans l'expression régulière.
La méthode met à jour le contenu de l'objet RegExp.
Extrait de l'aide javascript
Match , méthode
Renvoie, sous forme de tableau, les résultats d'une recherche sur une chaîne au moyen d'un objet Regular Expression qui lui est fourni.
La méthode match, qui se comporte comme la méthode exec, renvoie un tableau de valeurs. L'élément zéro du tableau contient les derniers caractères retenus. Les éléments 1...n contiennent les correspondances des sous-chaînes entre parenthèses dans l'expression régulière.
La méthode met à jour le contenu de l'objet RegExp.
Extrait du livre JavaScript, The Definitive Guide (et maladroitement traduit par mes soins) :
Citation
Synopsis
string.match(regexp)
Paramètres
regexp
Un objet RegExp qui indique le motif à rechercher. Si ce paramètre n'est pas une RegExp, il est d'abord converti en le passant au constructeur RegExp().
Return
Un tableau contenant le résultat de la recherche. Le contenu du tableau dépend de la présence de l'attribut "g" global de regexp. Les détails du retour sont donnés dans la description.
Description
match() recherche dans string une ou plusieurs occurrences de regexp. Le comportement de cette méthode diffère selon si regexp possède l'attribut "g" ou non. Si regexp n'a pas l'attribut "g", match() recherche dans string une unique occurrence de regexp. Si aucune n'est trouvée, match() retourne null. Sinon, elle retourne un tableau contenant des informations sur l'occurrence trouvée. L'élément 0 du tableau contient le texte trouvé. Les éléments restants contiennent le texte correctement aux sous-expressions éventuelles entre parathèses dans l'expression régulière. En plus de ces éléments, le tableau retourné a également deux propriétés. La propriété index du tableau indique la position dans string à laquelle début l'occurrence trouvée. De plus, la propriété input du tableau retourné est une référence à string.
Si regexp a le drapeau "g", match() effectue une recherche globale. La méthode retourne null si aucune occurrence n'est trouvée, et retourne un tableau si une ou plusieurs occurrences sont trouvées. Le contenu du tableau retourné est relativement différent lors des recherches globales, cependant. Dans ce cas, les éléments du tableau contiennent chacune des sous-chaînes spécifiées par regexp. Le tableau retourné n'a pas de propriété index ou input. Noter que pour les recherches globales, match() ne fournit pas d'informations concernant les sous-expressions entre parenthèses dans regexp, et n'indique pas non plus la position dans string à laquelle chaque occurrence apparaît. Pour obtenir ces informations lors d'une recherche globale, utiliser RegExp.exec().
J'ai réussis, c'est (presque) parfait (il reste quelques réglages) mais j'ai du séparer les deux RegExp :
var coords = true,
cont = true;
var production_table = document.getElementById('production_table');
var myReCoords = /(\(\d\d\d\|\d\d\d\))/g,
myReCont = /(C\d\d)/g,
resultCoords = production_table.innerHTML.match(myReCoords),
resultCont = production_table.innerHTML.match(myReCont),
i = 0;
var inputs = production_table.getElementsByTagName('input');
for (var l = 0; l < inputs.length; l++) {
if (inputs[l].id.indexOf('edit_input') != -1) {
if (coords == true && cont == true) {
inputs[l].value = resultCoords[i++] + " " + resultCont[i]; /* (000|000) */
}
else if (coords == true && cont == false) {
inputs[l].value = resultCoords[i++]; /* (000|000) */
}
else if (coords == false && cont == true) {
inputs[l].value = resultCont[i++]; /* C00*/
}
}
};
void(0);
Pas besoin de boucle while, j'incrémente i quand il le faut;
pour les conditions j'ai rajouté du code inutile (== true et == false) : c'est un choix, c'est pour la compréhension du code, ça m'aide ici
Merci a tous ceux qui m'ont aidé !
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Si, mon but est d'apprendre au plus, mais ta technique ne fonctionnait pas dans mon cas :
- Les chaines recherchés n'étaient pas une textarea mais dans tout la partie du document concerné.
- Les inputs n'ont pas d'id, j'ai du utiliser un tableau ...
J'avoue n'avoir peut être pas donné assez de précisions ...
Je précise que tu m'as quand même aidé, mon code ne c'est pas fait tout seul !
Je remercie donc ceux qui m'ont aidé, et ... c'est tout
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Désoler j'ai oublié de vous montrer mon code, il est similaire au tien Tiller (aussi désoler si je t'ai fais perdre du temps) :
var input_one = production_table.getElementsByTagName('input');
for (var h = 0; h < input_one.length; h++) {
if (input_one[h].id.indexOf('edit_input') != -1) {
inputs.push(input_one[h]);
}
}
for (var l = 0; l < inputs.length; l++) {
if (coords == true && cont == true) {
inputs[l].value = resultCoords[i++] + " " + resultCont[j++]; /* (000|000) et C00*/
}
else if (coords == true && cont == false) {
inputs[l].value = resultCoords[i++]; /* (000|000) */
}
else if (coords == false && cont == true) {
inputs[l].value = resultCont[i++]; /* C00*/
}
};
void(0);
Je l'ai aussi fais avec des ternaires :
javascript:
var coords = true,
cont = true;
var production_table = document.getElementById('production_table');
var myReCoords = /(\(\d\d\d\|\d\d\d\))/g,
myReCont = /(C\d\d)/g,
resultCoords = production_table.innerHTML.match(myReCoords),
resultCont = production_table.innerHTML.match(myReCont),
i = 0, j = 0;
var inputs = production_table.getElementsByTagName('input');
for (var l = 0; l < inputs.length; l++) {
if (inputs[l].id.indexOf('edit_input') != -1) {
var tern1 = coords ? resultCoords[i++] + " " : "";
var tern2 = cont ? resultCont[j++] : "";
inputs[l].value = tern1 + tern2;
}
};
void(0);
Mais je ne pense pas prendre ce code, car j'ajoute maintenant du code assez long (qui d'ailleurs ne fonctionne pas pour l'instant, mais je vais essayer de trouver moi-même pour ne pas trop vous embêter )
voila un avant-goût (je vous montrerais le final plus tard) :
if (contName == true) {
for (var k = 0; k < resultCont.length; k++) {
if (resultCont[k] == "C0"||"C1"||"C2"||"C3"||"C4"||"C10"||"C11"||"C12"||"C13"||"C14"||"C20"||"C21"||"C22"||"C23"||"C24"||"C30"||"C31"||"C32"||"C33"||"C34"||"C40"||"C41"||"C42"||"C43"||"C44") {
contsnames[k] = "nord-ouest";
}
else if (resultCont[k] == "C5"||"C6"||"C7"||"C8"||"C9"||"C15"||"C16"||"C17"||"C18"||"C19"||"C25"||"C26"||"C27"||"C28"||"C29"||"C35"||"C36"||"C37"||"C38"||"C39"||"C45"||"C46"||"C47"||"C48"||"C49") {
contsnames[k] = "nord-est";
}
else if (resultCont[k] == "C50"||"C51"||"C52"||"C53"||"C54"||"C60"||"C61"||"C62"||"C63"||"C64"||"C70"||"C71"||"C72"||"C73"||"C74"||"C80"||"C81"||"C82"||"C83"||"C84"||"C90"||"C91"||"C92"||"C93"||"C94") {
contsnames[k] = "sud-ouest";
}
else if (resultCont[k] == "C55"||"C56"||"C57"||"C58"||"C59"||"C65"||"C66"||"C67"||"C68"||"C69"||"C75"||"C76"||"C77"||"C78"||"C79"||"C85"||"C86"||"C87"||"C88"||"C89"||"C95"||"C96"||"C97"||"C98"||"C99") {
contsnames[k] = "sud-est";
}
}
inputs[l].value += " " + contsnames[m++];
}
Tu as remarqué que j'ai repris le "squelette" des codes que tu m'as donné précédemment
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Oui effectivement, si je n'arrive pas après une trop longue durée j'essaye de contourner le problème (je suis découragé de ne pas trouver la réponse que je cherche)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
J'ai finalement choisit les ternaires, c'est plus pratique et tout de même lisible
Merci de votre aide !!
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
[Question] RegExp : accéder aux parenthèse capturentes
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)
Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut ! (en bas à gauche de mon message)