资本化第一个字母,小写其余部分,但有例外

时间:2013-11-14 10:00:14

标签: javascript regex

我需要通过大写每个单词的第一个字母来格式化一些数据,并小写其余部分。我使用以下内容:

function toTitleCase(str){
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}

它可以工作,但我需要为它添加例外,所有值都在数组中: [美国,U.S.A,七喜,PC,SlimFast,...]

这些值有时高,有时低,有时混合,不需要修改。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

如何做到这一点:

function toTitleCase(str){
    var ignore = inArray(exceptionsArr, str);
    if (!ignore) {
        return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
    }
    return str;
}


inArray: function(arr, obj) {
    return (arr.indexOf(obj) != -1);
},

或者,如果你的str是一个整个句子,里面有异常单词,你可以将str分成单个单词,然后通过上面的过程用for循环运行每个单词。

答案 1 :(得分:1)

function toTitleCase(str){
    var cantTouchThis = {'USA' : 1, 'U.S.A' : 1, '7UP' : 1, 'PC' : 1, 'SLIMFAST' : 1};
    return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] ? txt : txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}

键是字符串的大写字母,您不想替换

值可以是评估为true

的任何值

但您可能还想在价值中给出唯一正确的套管 - 例如:

function toTitleCase(str){
    var cantTouchThis = {'USA' : 'USA', 'U.S.A' : 'USA', '7UP' : '7Up', 'PC' : 'PC', 'SLIMFAST' : 'SlimFast'};
    return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] || txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}

这样的字符串就像:

UsA U.S.A anything slimfast

将成为:

USA USA Anything SlimFast

答案 2 :(得分:1)

使用以下功能解决。

function toTitleCase(str){
      return str.replace(/\w\S*/g, function(txt){
        if(['PC','USA','U.S.A'].includes(txt))===-1){
          return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
        } else {
          return txt;
        }
      });
    }

name = toTitleCase(name);

答案 3 :(得分:1)

这可能不是你所需要的,但总体思路是:

  
      
  1. 分割/定位每个单词。
  2.   
  3. 检查它是否与忽略列表中的单词不匹配(使用i标志忽略大小写)
  4.   
  5. 如果没有,请将其大写,
  6.   
  7. 如果确实如此,请不要管它。
  8.   
var s = "UsA bar U.S.A. fOO slimfast bAz",
    ignore = ["USA", "U.S.A", "7UP", "PC", "SlimFast"],
    regex = new RegExp(ignore.join("|"), 'i'),

    result = s.split(' ').map(function(word){
        return (regex.test(word)) ? word : capitalize(word);
    }).join(' ');

// "UsA Bar U.S.A. Foo slimfast Baz"

function capitalize(s) {
    return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
}

答案 4 :(得分:0)

编辑:似乎我不太明白异常是整个单词。下面的答案是将例外作为单词的一部分。

我不是特别确定这是最好的解决方案,但你可以获得一系列匹配异常,然后运行你的函数,然后替换匹配。

var exceptions = ['USA','U\.S\.A','7UP','PC','SlimFast']; //escaped strings!

var matcher = new RegExp(exceptions.join('|'), 'gi');

var str = 'tuSalolpCOKyes'; //test string

var matches = str.match(matcher); // extract replacements


var str = toTitleCase(str); // run your function

// replace stuff you didn't want changed
var index = 0;
var str = str.replace(matcher, function() {
  return matches[index++];
});

console.log(str); // RESULT: TuSalolpCokyes


// your function
function toTitleCase(str){
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}