2011-08-22 9 views
7

Podając ciąg znaków, taki jak Marty Mcfly, czy istnieje regex lub inne rozwiązanie jednoliniowe, które zamienia na literę "f", aby uzyskać Marty McFly?Javascript, aby zamapować następny znak po "Mc"

Zawsze mogę liczyć na spację między pierwszą a ostatnią, a pierwsza litera nazwiska (tj. M) zawsze będzie literami.

Jestem dość otwarty na wszelkie rozwiązania javascript, jquery, regex, po prostu potrzebuję, aby były krótkie i słodkie.

Mam metodę, która rozdziela ciąg znaków za pomocą indexOf i substring, ale mam nadzieję, że jest regex lub coś podobnego.

+1

będzie musiała pracować dla Mac, jak również? A co z O'Connor? Deville? Porównaj O'Connor z D'eath. Jaki jest twój zakres? –

+0

Dobre pytania. Tak, byłoby miło, gdyby działało na Macu. Mam o'conner etal pokryty innym regex. Gdyby nie DeVille, nie wiem jak to powiedzieć, niezależnie od nazwy, która zaczyna się od "De", więc przetrwamy bez niego. – kasdega

+0

+1 za fajne, wieloplatformowe pytanie na temat regex! –

Odpowiedz

7

Można skorzystać z postaci String.replace który Funkcja jako drugi argument:

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

Działa idealnie. Dziękuję Ci! – kasdega

2

Użyj kombinacji exec metody regex i struny replace metody:

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

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

Oto wersja, która współpracuje z „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 za twoją pierwszą odpowiedź ... popraw mnie, jeśli się mylę, ale drugi zostałby spartaczony nazwą "Shane Mack", prawda? Zdecydowaliśmy, że będziemy żyć z małymi dziwactwami, takimi jak to, po prostu chcieliśmy uderzyć w niektóre z głównych rzeczy. Dzięki za poświęcenie czasu na odpowiedź. – kasdega

6

Jest to idealne rozwiązanie do korzystania z oddzwaniania z numerem .replace().

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

Oto jsFiddle http://jsfiddle.net/jfriend00/Qbf8R/ gdzie można zobaczyć go w akcji na kilku różnych przypadków testowych.

drodze wyjaśnienie, jak działa funkcja zwrotna, parametr match jest cały regex mecz, parametr p1 co pierwsza grupa nawiasach dopasowane i oddzwanianie powraca co chcesz zastąpić cały mecz z regex.

+0

Nigdy nie pomyślałem o użyciu tego plasterka. Dzięki. – kasdega

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

Oto najlepsze, co mogę zrobić:

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