2

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

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

它可以工作,但我需要为其添加例外,所有值都在一个数组中:[USA,USA,7UP,PC,SlimFast,...]

这些值有时较高,有时较低,有时混合,无需修改。有任何想法吗?

4

5 回答 5

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 循环通过上述过程运行每个单词。

于 2013-11-14T10:05:14.420 回答
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

于 2013-11-14T10:06:12.110 回答
1

Solved using the following function.

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);
于 2013-11-14T10:24:25.687 回答
1

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

  1. 拆分/定位每个单词。
  2. 检查它是否与忽略列表中的单词不匹配(使用i标志忽略大写)
  3. 如果不是,请大写,
  4. 如果是这样,请不要理会它。
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();
}
于 2013-11-14T10:54:46.683 回答
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();});
}
于 2013-11-14T10:12:01.140 回答