Javascript 首字母大写,其余字母小写,例外

Javascript 首字母大写,其余字母小写,例外,javascript,regex,Javascript,Regex,我有一些数据需要格式化,将每个单词的第一个字母大写,其余字母小写。我正在使用以下工具: function toTitleCase(str){ return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); } 它可以工作,但我需要向它添加异常,所有值都在一个数组中: [美国、美国、7UP、PC、SlimFast等] 这些值有时较

我有一些数据需要格式化,将每个单词的第一个字母大写,其余字母小写。我正在使用以下工具:

function toTitleCase(str){
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
它可以工作,但我需要向它添加异常,所有值都在一个数组中: [美国、美国、7UP、PC、SlimFast等]


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

关于以下内容:

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循环运行上述过程中的每个词

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.FAST

将成为:


USA Anything SlimFast

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

我不确定这是否是最好的解决方案,但您可以获得一个与异常匹配的数组,然后运行函数,然后将匹配项替换回来

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();});
}

使用以下函数求解

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);

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

  • 拆分/针对每个单词
  • 检查它是否与忽略列表中的单词不匹配(使用
    i
    标志忽略大小写)
  • 如果没有,就将其资本化
  • 如果有,就别管它

  • 使用白名单数组怎么样?如果数组中存在
    txt
    ,则返回而不执行任何操作。@h2ooooooo:我应该编写
    txt
    ,而不是
    str
    。现在已修复。您可以避免使用
    charAt
    substr
    这样做:
    s.replace(/(\w)(\s*)/g,函数(m,a,b){返回a.toUpperCase()+b.toLowerCase();})
    .FYI:
    indexOf
    首先添加到IE9中的数组中。您用uuxofcantTouchThis.毁了您的答案。。很好+1.
    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();
    }