2011-08-22 45 views
7

Cho một chuỗi như Marty Mcfly là có một giải pháp regex hoặc một dòng khác để tận dụng 'f' để tôi nhận được Marty McFly?Javascript để viết hoa chữ cái tiếp theo sau "Mc"

Tôi luôn có thể đếm trên khoảng trống giữa chữ cái đầu tiên và cuối cùng và chữ cái đầu tiên của họ (ví dụ: M) sẽ luôn là mũ.

Tôi khá cởi mở với bất kỳ giải pháp javascript, jquery, regex nào, tôi chỉ cần nó ngắn và ngọt ngào.

Tôi đã có một phương pháp tách chuỗi bằng cách sử dụng indexOf và chuỗi con nhưng tôi hy vọng có một regex hoặc một cái gì đó tương tự.

+1

Nó sẽ cần phải làm việc cho Mac không? Còn O'Connor thì sao? DeVille? So sánh O'Connor với D'eath. Phạm vi của bạn là gì? –

+0

Câu hỏi hay. Có nó sẽ được tốt đẹp nếu nó làm việc trên một mac. Tôi đã nhận được o'conner etal được bảo hiểm với regex khác. Mặc dù không phải DeVille mặc dù tôi không biết làm thế nào bạn muốn nói rằng ngoài bất kỳ tên nào bắt đầu với "De" vì vậy chúng tôi sẽ tồn tại mà không có nó. – kasdega

+0

+1 cho câu hỏi regex đẹp, đa nền tảng! –

Trả lời

7

Bạn có thể tận dụng lợi thế của hình thức String.replace mà lấy hàm làm đối số thứ hai:

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

Hoạt động hoàn hảo. Cảm ơn bạn! – kasdega

2

Sử dụng một sự kết hợp của phương pháp exec RegEx và replace phương pháp chuỗi của:

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

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

Dưới đây là một phiên bản làm việc với "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 cho câu trả lời đầu tiên của bạn ... sửa tôi nếu tôi sai nhưng người thứ hai sẽ bị xáo trộn với cái tên như "Shane Mack" phải không? Chúng tôi quyết định rằng chúng tôi sẽ sống với những điều kỳ quặc như thế này, chúng tôi chỉ muốn đánh một số thứ chính. Cảm ơn vì đã dành thời gian trả lời. – kasdega

6

Đây là trường hợp hoàn hảo để sử dụng gọi lại với .replace().

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

Đây là một jsFiddle http://jsfiddle.net/jfriend00/Qbf8R/ nơi bạn có thể thấy nó hoạt động trên một số trường hợp thử nghiệm khác nhau. Bằng cách giải thích cho cách gọi lại hoạt động, tham số match là toàn bộ kết hợp regex, tham số p1 là những gì nhóm dấu ngoặc đơn đầu tiên phù hợp và gọi lại trả về những gì bạn muốn thay thế toàn bộ so khớp regex.

+0

không bao giờ nghĩ đến việc sử dụng lát như thế. Cảm ơn. – kasdega

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

Dưới đây là tốt nhất mà tôi có thể làm:

'Marty Mcfly'.replace(/ mc([a-z])/i, function (str, $1) {return " Mc" + $1.toUpperCase()}) 
Các vấn đề liên quan