2011-08-22 9 views
7

Dato una stringa come Marty Mcfly c'è una espressione regolare o un'altra soluzione a una riga per scrivere in maiuscolo 'f', quindi ottengo Marty McFly?Javascript per scrivere il carattere successivo dopo "Mc"

Posso sempre contare sullo spazio tra il primo e l'ultimo e la prima lettera del cognome (cioè la M) sarà sempre limitata.

Sono abbastanza aperto a qualsiasi soluzione javascript, jquery, regex, ho solo bisogno che sia breve e dolce.

Ho un metodo che separa la stringa usando indexOf e sottostringa, ma spero che ci sia un'espressione regolare o qualcosa di simile.

+1

Sarà necessario lavorare per Mac pure? Che dire di O'Connor, ecc.? DeVille? Confronta O'Connor con D'eath. Qual è il tuo scopo? –

+0

Buone domande. Sì, sarebbe bello se funzionasse su un Mac. Ho l'eté di o'conner coperto da un'altra regex. Non avevo pensato a DeVille, anche se non so come lo diresti a parte qualsiasi nome che inizia con "De", quindi sopravviveremo senza di esso. – kasdega

+0

+1 per una domanda regex piacevole e cross-platform! –

risposta

7

È possibile sfruttare la forma di String.replace che prende una funzione come secondo argomento:

function fixMarty(s) { 
    return (""+s).replace(/Mc(.)/g, function(m, m1) { 
    return 'Mc' + m1.toUpperCase(); 
    }); 
} 
fixMarty('Marty Mcfly'); // => "Marty McFly" 
fixMarty("Mcdonald's"); // => "McDonald's" 
+0

Funziona perfettamente. Grazie! – kasdega

2

utilizzare una combinazione del metodo di RegEx exec e replace il metodo di stringa:

var name = 'Marty Mcfly', 
    pattern = /\bmc([a-z])/gi, 
    match = pattern.exec(name); 

if (match) { 
    alert(name.replace(pattern, 'Mc' + match[1].toUpperCase())); 
} 

Ecco una versione che funziona con "Mac":

var name = 'Connor Macleod', 
    pattern = /\b(mc|mac)([a-z])/gi, 
    match = pattern.exec(name); 

if (match) { 
    alert(name.replace(pattern, match[1] + match[2].toUpperCase())); 
} 
+0

+1 per la tua prima risposta ... correggimi se sbaglio ma il secondo verrebbe incasinato con un nome come "Shane Mack" giusto? Abbiamo deciso di vivere con le piccole stranezze come questa, volevamo solo colpire alcune delle cose principali. Grazie per aver dedicato del tempo per rispondere. – kasdega

6

Questo è un caso perfetto per l'utilizzo di una richiamata con .replace().

function fixMc(str) { 
    return(str.replace(/\bMc(\w)/, function(match, p1) { 
     return(match.slice(0, -1) + p1.toUpperCase()); 
    })); 
} 

Ecco un jsFiddle http://jsfiddle.net/jfriend00/Qbf8R/ dove è possibile vederlo in azione su un diversi casi di test differenti.

A titolo di spiegazione per il funzionamento del richiamata, il parametro match è tutta la partita regex, il parametro p1 è ciò che il primo gruppo tra parentesi abbinato e la richiamata restituisce ciò che si desidera sostituire tutta la partita regex con.

+0

non ho mai pensato di usare una fetta del genere. Grazie. – kasdega

2
var text = 'Marty Mcfly'; 
text = text.replace(/Mc[a-z]/, function (k) 
    { 
     return 'Mc' + k[2].toUpperCase(); 
    } 
); 
1

Ecco il meglio che posso fare:

'Marty Mcfly'.replace(/ mc([a-z])/i, function (str, $1) {return " Mc" + $1.toUpperCase()}) 
Problemi correlati