96 votes

JavaScript - Renvois de chaînes de caractères

Vous pouvez faire une référence arrière comme ceci en JavaScript :

var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");

Cela remplacerait (de manière tout à fait stupide) "$test" par "test". Mais imaginez que je veuille passer la chaîne de caractères résultante de $2 dans une fonction, qui renvoie une autre valeur. J'ai essayé de le faire, mais au lieu d'obtenir la chaîne "test", j'obtiens "$2". Existe-t-il un moyen d'y parvenir ?

// Instead of getting "$2" passed into somefunc, I want "test"
// (i.e. the result of the regex)
str = str.replace(/(\$)([a-z]+)/gi, somefunc("$2"));

122voto

SLaks Points 391154

Comme ça :

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })

1 votes

Génial, où puis-je trouver plus d'informations à ce sujet ?

9 votes

11 votes

Cool. Pour clarifier : $1 y $2 sont des noms de paramètres choisis par l'utilisateur ici (choisis pour imiter les symboles de rétro-référence) ; le nombre - variable ! - de ces paramètres correspond au nombre de groupes de capture dans la regex.

36voto

Sean Points 15363

Passez une fonction comme deuxième argument à replace :

str = str.replace(/(\$)([a-z]+)/gi, myReplace);

function myReplace(str, group1, group2) {
    return "+" + group2 + "+";
}

Cette fonctionnalité existe depuis Javascript 1.3, selon le site Web de la Commission européenne. mozilla.org .

2voto

Oddant Points 1063

J'utilise ESNext, un substitut de liens assez factice mais juste pour montrer comment il fonctionne :

let text = 'Visit http://lovecats.com/new-posts/ and https://lovedogs.com/best-dogs NOW !';

text = text.replace(/(https?:\/\/[^ ]+)/g, (match, link) => {
  // remove ending slash if there is one
  link = link.replace(/\/?$/, '');

  return `<a href="${link}" target="_blank">${link.substr(link.lastIndexOf('/') +1)}</a>`;
});

document.body.innerHTML = text;

0voto

Jackson Points 6654

Note : La réponse précédente manquait du code. C'est maintenant corrigé + exemple.


J'avais besoin de quelque chose d'un peu plus flexible pour un remplacement de regex afin de décoder l'unicode dans mes données JSON entrantes :

var text = "some string with an encoded '&#115;' in it";

text.replace(/&#(\d+);/g, function() {
  return String.fromCharCode(arguments[1]);
});

// "some string with an encoded 's' in it"

0voto

7ochem Points 2025

Si vous avez une quantité variable de rétro-références, le nombre d'arguments (et leur emplacement) est également variable. Le site Docs Web du MDN décrivent la syntaxe suivante pour séparer une fonction comme argument de remplacement :

function replacer(match[, p1[, p2[, p...]]], offset, string)

Par exemple, prenez ces expressions régulières :

var searches = [
    'test([1-3]){1,3}',  // 1 backreference
    '([Ss]ome) ([A-z]+) chars',  // 2 backreferences
    '([Mm][a@]ny) ([Mm][0o]r[3e]) ([Ww][0o]rd[5s])'  // 3 backreferences
];
for (var i in searches) {
    "Some string chars and many m0re w0rds in this test123".replace(
        new RegExp(
            searches[i]
            function(...args) {
                var match = args[0];
                var backrefs = args.slice(1, args.length - 2);
                // will be: ['Some', 'string'], ['many', 'm0re', 'w0rds'], ['123']
                var offset = args[args.length - 2];
                var string = args[args.length - 1];
            }
        )
    );
}

Vous ne pouvez pas utiliser la variable 'arguments' ici car elle est du type Arguments et aucun de type Array donc il n'y a pas de slice() méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X