2015-07-18 14 views
5

Quello che sto cercando di fare è scrivere una funzione per sostituire una singola parola in una determinata frase. Uno dei requisiti è che il caso della parola sostituita venga conservato come con l'originale.RegExp dinamico con conservazione del caso in JavaScript

ho scritto la seguente funzione:

function replace(str, before, after) { 
 
    var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i'); 
 
    return str.replace(re, after); 
 
} 
 

 

 
// DEBUG 
 
console.log('----- DEBUG START -----'); 
 

 
var tasks = [ 
 
    replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"), 
 
    replace("Let us go to the store", "store", "mall"), 
 
    replace("He is Sleeping on the couch", "Sleeping", "sitting"), 
 
    replace("This has a spellngi error", "spellngi", "spelling"), 
 
    replace("His name is Tom", "Tom", "john"), 
 
    replace("Let us get back to more Coding", "Coding", "bonfires"), 
 
]; 
 

 
for (var i = 0; i < tasks.length; i++) { 
 
    console.log('Result #' + i + ': ' + tasks[i]); 
 
} 
 

 
console.log('----- DEBUG END -----');

Tutto funziona bene, oltre al fatto che il caso della parola after non è la stessa come il caso della parola before.

INFORMAZIONI:

ho risolto lo stesso problema usando array (usando split(), splice(), indexOf()) e sostituendo solo l'elemento before con un non-dinamica RegExp() e la causa è stata conservata. Questo è il motivo per cui non capisco perché la mia altra soluzione non funzioni.

risposta

3

Si sta sostituendo una stringa di caratteri con un'altra stringa di caratteri. JS non applica magicamente la lettera maiuscola della parola originale alla parola sostitutiva in quanto ciò potrebbe portare a comportamenti potenzialmente indesiderati. Se devi preservare i casi di personaggi, devi fare di tutto per farlo.

Se vi interessa soltanto la capitalizzazione della prima lettera, è possibile effettuare le seguenti operazioni nella funzione replace:

function replace(str, before, after) { 
 
    var b0 = before[0]; 
 
    after = after.replace(/^(.)/, function(a0){ 
 
    return b0.toUpperCase() === b0 ? a0.toUpperCase() : a0.toLowerCase(); 
 
    }); 
 
    var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i'); 
 
    return str.replace(re, after); 
 
} 
 

 
// DEBUG 
 
document.write('----- DEBUG START -----<br>'); 
 

 
var tasks = [ 
 
    replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"), 
 
    replace("Let us go to the store", "store", "mall"), 
 
    replace("He is Sleeping on the couch", "Sleeping", "sitting"), 
 
    replace("This has a spellngi error", "spellngi", "spelling"), 
 
    replace("His name is Tom", "Tom", "john"), 
 
    replace("Let us get back to more Coding", "Coding", "bonfires"), 
 
]; 
 

 
    for (var i = 0; i < tasks.length; i++) { 
 
    document.write('Result #' + i + ': ' + tasks[i]+'<br>'); 
 
} 
 

 
document.write('----- DEBUG END -----');

+0

Grazie - Io non penso a questo. – bx2

Problemi correlati