2011-08-22 11 views
7

Dada una cadena como Marty Mcfly ¿hay una solución de expresiones regulares u otra línea para capitalizar la 'f' entonces obtengo Marty McFly?Javascript para poner en mayúscula el siguiente carácter después de "Mc"

Siempre puedo contar con el espacio entre la primera y la última y la primera letra del apellido (es decir, la M) siempre será mayúsculas.

Estoy bastante abierto a casi cualquier solución javascript, jquery, regex, solo necesito que sea breve y dulce.

Tengo un método que separa la cadena usando indexOf y subcadena, pero espero que haya una expresión regular o algo similar.

+1

¿Va a necesitar trabajar para Mac también? ¿Qué hay de O'Connor, etc.? DeVille? Compare O'Connor con D'eath. ¿Cuál es tu alcance? –

+0

Buenas preguntas. Sí, sería bueno si funciona en un mac. Tengo el o'conner etal cubierto con otra expresión regular. Aunque no pensé en DeVille, no sé cómo lo dirías aparte de cualquier nombre que empiece por "De", así que sobreviviremos sin él. – kasdega

+0

+1 para una buena pregunta de expresiones regulares multiplataforma! –

Respuesta

7

Usted puede tomar ventaja de la forma de String.replace cuales toma una función como su segundo argumento:

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

Funciona a la perfección. ¡Gracias! – kasdega

2

utilizar una combinación del método de RegEx exec y replace método de encordado:

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

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

Aquí hay una versión que funciona 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 para su primera respuesta ... corríjanme si me equivoco pero el segundo se equivocaría con un nombre como "Shane Mack" ¿verdad? Decidimos que viviríamos con los pequeños caprichos como este, solo queríamos golpear algunas de las cosas principales. Gracias por tomarse el tiempo para responder. – kasdega

6

Este es un caso perfecto para usar una devolución de llamada con .replace().

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

Aquí hay una jsFiddle http://jsfiddle.net/jfriend00/Qbf8R/ donde se puede verlo en acción en un varios casos de prueba diferentes.

A modo de explicación para el funcionamiento de la devolución de llamada, el parámetro es match todo el partido expresiones regulares, el parámetro p1 es lo que el primer grupo entre paréntesis corresponde y la devolución de llamada devuelve lo que desea reemplazar todo el partido con expresiones regulares.

+0

nunca pensé en usar slice así. Gracias. – kasdega

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

Esto es lo mejor que puedo hacer:

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