首页 文章

只有当lengh> 2时,Javascript才会将字符串中每个单词的首字母大写

提问于
浏览
4

我查看了有关StackOverflow中大写的一些问题和答案,但无法找到有关我的问题的答案 .

我想在字符串长度> 2时将字符串中的每个单词的首字母大写 .

我的临时解决方案是:

var str =  str.toLowerCase().replace(/\b[a-z]/g, function (letter) {
                return letter.toUpperCase();
            }).replace(/\b\w{1,2}\b/g, function (letter) {
                return letter.toLowerCase();
            });

有一个解决方案可以将两个正则表达式合二为一吗?

6 回答

  • 3

    这必须做的工作:

    str = str.toLowerCase().replace(/\b[a-z](?=[a-z]{2})/g, function(letter) {
        return letter.toUpperCase(); } );
    

    [编辑]

    上面的例子有点幼稚,因为它假定字符串中只有字母,并且没有考虑字边界 \b 可以匹配单词字符 [a-zA-Z0-9_] 与非单词字符或锚点之间的限制 . 因此,为了更严格,最好写:

    str = str.toLowerCase().replace(/([^a-z]|^)([a-z])(?=[a-z]{2})/g, function(_, g1, g2) {
        return g1 + g2.toUpperCase(); } );
    

    如果你想这样做,但这一次,包括字符串的第一个字母(无论后面的字母数),你可以使用这个:

    str = str.toLowerCase().replace(/([^a-z])([a-z])(?=[a-z]{2})|^([a-z])/g, function(_, g1, g2, g3) {
        return (typeof g1 === 'undefined') ? g3.toUpperCase() : g1 + g2.toUpperCase(); } );
    
  • 13

    试试这个:

    var str = str.toLowerCase().replace(/\b\w{3,}/g, function (l) {
        return l.charAt(0).toUpperCase() + l.slice(1);
    });
    
  • 0

    也许使用一个函数来使它更干净

    var capitalize1st = function(str){
        str = str || '';
    
        // string length must be more than 2
        if(str.length<3){
            return str;
        }
    
        return str[0].toUpperCase()+str.slice(1);
    }
    
    var splitWordsAndCap1st = function(str){
        str = str || '';
    
        var words = str.match(/\S+/g);
    
        for(var i=0;i<words.length;i++){
            words[i] = capitalize1st(words[i]);
        }
    
        return words.join(' ');
    }
    
    splitWordsAndCap1st("I would like to capitalize first letter of each word in a string");
    
  • 0

    不需要正则表达式(只需要一个小的捕获空格),你可以这样做

    使用Javascript

    function titleCaseLengthGt2(string) {
        var array = string.split(/(\s+)/),
            length = array.length,
            i = 0,
            word;
    
        while (i < length) {
            //array[i] = array[i].toLowerCase(); // make words lowercased first if you want
            word = array[i];
            if (word.length > 2) {
                array[i] = word.charAt(0).toUpperCase() + word.slice(1);
            }
    
            i += 1;
        }
    
        return array.join("");
    }
    
    console.log(titleCaseLengthGt2("i  want  to  be  titelised"));
    

    产量

    i  Want  to  be  Titelised
    

    jsfiddle

  • 0

    如果字长> 2,要将字符串中每个单词的首字母大写,我用于英文文本:

    l_text = l_text.toLowerCase().replace(/(?=\b)([a-z])(?=[a-z]{2})/g, 
         function(g0) {return (g0.toUpperCase());});
    

    在现实生活中,“字长> 2”的规则是不够的 .

    要用法语来大写城镇名称,我必须排除一些像这个样本中的单词:

    l_text = "Bourg-en-Bresse, NEUILLY SUR SEINE, enghien-les-bains";
    l_text = l_text.toLowerCase().replace(/(?=\b)(?!(?:d|en|les|sous|sur)\b)([a-z])/g,
         function(g0) {return (g0.toUpperCase());});
    

    对于更复杂的情况,您可以组合负前瞻断言(?!(:| en | les | sous | sur)\ b)和正向前瞻断言(?= [a-z] {2}) .

    要处理非标准单词边界和a-z范围之外的字符,您可以使用单词边界和特定于上下文的字符集:

    /(?:^|[\s'\-])(?!(?:d|en|les|sous|sur)[\s'\-])([a-zàâéèêïôùûç])/g
    
  • 0

    这是一个更简单的解决方案,可以完成这项工作 .

    const capitalize = (str) =>
      str.toLowerCase().replace(/\w{3,}/g, (match) =>
        match.replace(/\w/, (m) => m.toUpperCase()));
    

相关问题