2016-12-05 109 views
1

我正在製作一個AngularJS過濾器,它將每個單詞的首字母大寫。 它與a-zA-Z字母配合良好,但在我的情況下,我還使用西里爾文字符,並且希望使其工作。用JavaScript編寫西里爾字符串

var strLatin = "this is some string"; 
var strCyrillic = "това е някакъв низ"; 

var newLatinStr = strLatin.replace(/\b[\wа-яА-Я]/g, function(l){ 
    return l.toUpperCase(); 
}); 

var newCyrillicStr = strCyrillic.replace(/\b[\wа-яА-Я]/g, function(l){ 
    return l.toUpperCase(); 
}); 

在這裏,我得到了一些CodePen例如:http://codepen.io/brankoleone/pen/GNxjRM

回答

1

需要自定義字邊界,你可以建立使用分組:

var strLatin = "this is some string"; 
 
var strCyrillic = "това е някакъв низ"; 
 
var block = "\\w\\u0400-\\u04FF"; 
 
var rx = new RegExp("([^" + block + "]|^)([" + block + "])", "g"); 
 

 
var newLatinStr = strLatin.replace(rx, function($0, $1, $2){ 
 
    return $1+$2.toUpperCase(); 
 
}); 
 
console.log(newLatinStr); 
 
var newCyrillicStr = strCyrillic.replace(rx, function($0, $1, $2){ 
 
    return $1+$2.toUpperCase(); 
 
}); 
 
console.log(newCyrillicStr);

詳細

  • block包含所有ASCII字母,數字和下劃線,並從basic Cyrillic range所有基本西里爾字符(如果你需要更多的,請參閱Cyrillic script in Unicode ranges維基文章和更新的正則表達式因此),也許,你只是想匹配俄羅斯與А-ЯЁёа-я,然後使用var block = "\\wА-ЯЁёа-я
  • 最終正則表達式匹配並捕獲到組1除塊或字符串開始處定義的字符以外的任何字符,然後將該塊中定義的任何字符與第2組相匹配並捕獲。
0

試試:

function capitalizer(string) { 
    return string.split(/\s/).map(function(item){ 
    return (item.charAt(0).toUpperCase() + item.slice(1)) 
    }).join(' ') 
} 

Example

+0

沒有,這將使任何位置的字母具有優先權。這裏需要自定義字邊界。 –

+0

我同意,這個例子返回'「ТОВАЕНЯКАКЪВНИЗ」',但我更需要'「ТоваЕНякакъвНиз」' – Leo

+0

對不起,夥計們,1min) –

1

如果使用Lodash,你可以使用_.startCase,而不是你自己的實現(他們這樣做是通過分割字符串轉換成單詞,大寫每個單詞的第一個字符,然後將它們連接到一起)