10

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

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

4

6 回答 6

19

这必须完成工作:

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(); } );
于 2013-06-19T20:28:51.770 回答
3

尝试这个:

var str = str.toLowerCase().replace(/\b\w{3,}/g, function (l) {
    return l.charAt(0).toUpperCase() + l.slice(1);
});
于 2013-06-19T20:30:56.880 回答
2

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

const capitalize = (str) =>
  str.toLowerCase().replace(/\w{3,}/g, (match) =>
    match.replace(/\w/, (m) => m.toUpperCase()));
于 2018-09-21T11:16:19.860 回答
1

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

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");
于 2013-06-19T20:34:31.757 回答
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) 和肯定前瞻断言 (?=[az]{2}) 结合起来。

要处理非标准单词边界和超出 az 范围的字符,您可以使用特定于上下文的单词边界和字符集:

/(?:^|[\s'\-])(?!(?:d|en|les|sous|sur)[\s'\-])([a-zàâéèêïôùûç])/g
于 2014-06-10T07:07:34.813 回答
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上

于 2013-06-19T20:42:17.600 回答