2010-03-23 3 views
6

Je dois trouver le moyen le plus efficace de faire correspondre plusieurs expressions régulières sur un seul bloc de texte. Pour donner un exemple de ce que je dois, envisager un bloc de texte:Remplacer plusieurs modèles dans un bloc de données

« Bonjour tout le monde quel beau jour »

Je veux remplacer Bonjour à « Bye » et « World » avec l'univers. Je peux toujours le faire en boucle, en utilisant quelque chose comme les fonctions String.replace disponibles dans plusieurs langues.

Cependant, je pourrais avoir un énorme bloc de texte avec plusieurs modèles de chaînes, que je dois faire correspondre et remplacer. Je me demandais si je pouvais utiliser des expressions régulières pour le faire efficacement ou si je devais utiliser un analyseur comme LALR.

Je dois le faire en JavaScript, donc si quelqu'un connaît des outils qui peuvent y arriver, ce serait apprécié.

Répondre

6

Vous pouvez passer une fonction à remplacer:

var hello = "Hello World what a beautiful day"; 
hello.replace(/Hello|World/g, function ($0, $1, $2) // $3, $4... $n for captures 
{ 
    if ($0 == "Hello") 
     return "Bye"; 
    else if ($0 == "World") 
     return "Universe"; 
}); 

// Output: "Bye Universe what a beautiful day"; 
+0

Juste une note, Andy E: Vous avez besoin d'un ')' 'avant,' sur la dernière ligne :) –

+0

@smotchkkiss: Oui, je remarquai que comme je tapais le commentaire au fond et complètement oublié au moment où j'ai fini! Merci :-) –

+0

Merci, c'est vraiment utile. Cependant, les correspondances regex sont-elles limitées à $ 1 .. $ 9 ou pouvons-nous aussi $ 10, $ 11 etc ... – VikrantY

10

Modifier

6 ans après ma première réponse (ci-dessous) je résoudre ce problème différemment

function mreplace (replacements, str) { 
 
    let result = str; 
 
    for (let [x, y] of replacements) 
 
    result = result.replace(x, y); 
 
    return result; 
 
} 
 

 
let input = 'Hello World what a beautiful day'; 
 

 
let output = mreplace ([ 
 
    [/Hello/, 'Bye'], 
 
    [/World/, 'Universe'] 
 
], input); 
 

 
console.log(output); 
 
// "Bye Universe what a beautiful day"

Cela a comme énorme annonce vantage sur la réponse précédente qui vous obligeait à écrire chaque match deux fois. Il vous donne également un contrôle individuel sur chaque match. Par exemple:

function mreplace (replacements, str) { 
 
    let result = str; 
 
    for (let [x, y] of replacements) 
 
    result = result.replace(x, y); 
 
    return result; 
 
} 
 

 
let input = 'Hello World what a beautiful day'; 
 

 
let output = mreplace ([ 
 
    //replace static strings 
 
    ['day', 'night'], 
 
    // use regexp and flags where you want them: replace all vowels with nothing 
 
    [/[aeiou]/g, ''], 
 
    // use captures and callbacks! replace first capital letter with lowercase 
 
    [/([A-Z])/, $0 => $0.toLowerCase()] 
 

 
], input); 
 

 
console.log(output); 
 
// "hll Wrld wht btfl nght"


réponse originale

réponse de Andy E peut être modifié pour ajouter des définitions de remplacement plus facile.

var text = "Hello World what a beautiful day"; 
text.replace(/(Hello|World)/g, function ($0){ 
    var index = { 
    'Hello': 'Bye', 
    'World': 'Universe' 
    }; 
    return index[$0] != undefined ? index[$0] : $0; 
}); 

// "Bye Universe what a beautiful day"; 
+0

Merci Andy/smotchkiss vous avez tous les deux complètement trié mon problème et évité moi d'avoir à écrire mon propre algorithme, pour le remplacement multiple. – VikrantY

+2

Vous ne devriez probablement pas recréer l'objet de recherche pour chaque appel à la fonction de remplacement, à droite, mais à l'extérieur? – Phrogz

1

Une meilleure réponse:

var index = { 
    'Hello': 'Bye', 
    'World': 'Universe' 
}; 

var pattern = ''; 
for (var i in index) { 
    if (pattern != '') pattern += '|'; 
    pattern += i; 
} 

var text = "Hello World what a beautiful day"; 
text.replace(new RegExp(pattern, 'g'), function($0) { 
    return index[$0] != undefined ? index[$0] : $0; 
}); 
+0

C'est une vieille question avec de vieilles réponses.Je pense que vous offrez une bonne amélioration, mais vous pouvez étendre encore plus de puissance à l'utilisateur en ne forçant pas leur entrée via le constructeur 'RegExp' et l'indicateur auto-adjending' g'. –

Questions connexes