【问题标题】:Convert string to Title Case with JavaScript使用 JavaScript 将字符串转换为标题大小写
【发布时间】:2010-09-16 20:29:25
【问题描述】:

有没有一种简单的方法可以将字符串转换为标题大小写?例如。 john smith 变为 John Smith。我不是在寻找像John Resig's solution 这样复杂的东西,只是(希望)某种一两线。

【问题讨论】:

标签: javascript title-case


【解决方案1】:

试试这个:

function toTitleCase(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}
<form>
  Input:
  <br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)" onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
  <br />Output:
  <br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>

【讨论】:

  • 谁能解释一下,为什么使用\w\S*,而不是\w+\w*?我不知道,为什么您要包含除空格以外的任何内容,因此将 Jim-Bob 更改为 Jim-bob
  • @martinCzerwi \w\S* 也导致了我们这边的Jim-bob 问题。使用\w* 解决了这个问题。
  • /([^\W_]+[^\s-]*) */g 解决了Jim-Bob 问题,即:jim-bob --&gt; Jim-Bob
  • 如果 jim-bob --&gt; Jim-Bob 是你的愿望,你应该这样做 /\b\w+/g。示例:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
  • \w\S* 被用来代替\w+\w*,这样Don't 这样的词就不会被修改为Don'T,但正如其他人指出的那样,\w\S* 会导致问题带有连字符。
【解决方案2】:

如果 CSS 解决方案满足您的需求,您可以将 text-transform CSS 样式应用于您的控件:

text-transform: capitalize;

请注意,这将转换:
hello worldHello World
HELLO WORLDHELLO WORLD(没有变化)
emily-jane o'brienEmily-jane O'brien(不正确)
Maria von TrappMaria Von Trapp(不正确)

【讨论】:

  • -1。这个 css 可以工作,但不能像大多数人期望的那样工作,因为如果文本以全部大写开头,则没有效果。 webmasterworld.com/forum83/7506.htm
  • @Akshar :小写规则将被标题大小写规则替换。由于 css 不会修改源内容,因此效果是删除了小写规则(保留所有大写的源内容),然后应用标题规则(什么都不做)。
  • JS 在浏览器之外使用。
  • 问题是:“有没有一种简单的方法可以将字符串转换为标题大小写?”。此答案不会转换字符串。这是应用于字符串顶部的样式。
  • +1 问题含糊不清,没有解释用例。也许他们想用 JS 转换字符串,但实际上 CSS 更适合他们,就像我的情况一样。
【解决方案3】:

稍微优雅一点的方式,改编 Greg Dean 的函数:

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

这样称呼:

"pascal".toProperCase();

【讨论】:

  • 请记住,如果您的用户名中有破折号并且他们输入了Jo-Ann Smith,此代码会将他们转换为Jo-ann Smith(注意Ann 中的小写a) .
  • @daniellmb 为什么他不应该改变字符串原型?我认为这是一个很好的解决方案。想想 ruby​​ 开放类,向现有类添加功能是完全有效的,并且被广泛接受。
  • @marco-fiset 因为它不能很好地与其他人一起玩!当您有 2 个库都试图用不兼容的更改修改本机 JavaScript 对象时,就会发生不好的事情。想象一下,如果 jQuery 和 Google Maps 都遵循这种设计模式,那么您就不可能在同一个页面上同时拥有两者。
  • @daniellmb 一个很好的观点。为方法名称添加前缀应该有助于避免这种情况,因为使方法不可枚举。
  • 我觉得“不要修改原生 JavaScript 对象”语句就像“从不使用 goto”或“eval 是邪恶的”。有很多情况是可以的。如果您完全控制您的项目,当然不打算将其作为库发布,我认为这种方法没有问题。
【解决方案4】:

这是我的版本,IMO 它也很容易理解和优雅。

var str = "foo bar baz"

console.log(

str.split(' ')
   .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
   .join(' ')

)
// returns "Foo Bar Baz"

【讨论】:

  • 或者,您可以将映射中的子字符串小写:str.split(' ').map(i =&gt; i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
  • 我不同意打电话给.toLowerCase()。诸如“McDonald”之类的名称或诸如“ASAP”之类的首字母缩略词应保留其大写字符。如果有人实际上传入了“heLLO”之类的字符串,则应用程序不应假定大写字母不正确。
  • @ThomasHigginbotham 这个怎么样? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i =&gt; i[0].toUpperCase() + i.substr(1)) .join(' '); }
  • 如果str 是单个字符,这将中断。
  • 这看起来是the fastest solution :)
【解决方案5】:

这是我的函数,它转换为标题大小写,但也将定义的首字母缩略词保留为大写字母,将次要单词保留为小写字母:

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

例如:

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

【讨论】:

  • 我喜欢你的,我在处理罗马数字时也遇到了问题......只是用 I、II、III、IV 等修补了它。
  • 已修复。根据上面@awashburn 的评论,第三行中的正则表达式已从/\w\S*/g 更改为/([^\W_]+[^\s-]*) */g 以解决此问题。
  • 使用您的正则表达式模式是否比/\b\w+/g 更有优势,我发现它更容易理解?
  • 我看不出来,我只是在接受另一个评论者的建议来解决连字符问题;但是您的正则表达式似乎也做得很好,而且简单性总是更好。对于这篇文章的后代和未来的访问者,我只是根据@Michael 的评论将第三行中的正则表达式从/([^\W_]+[^\s-]*) */g 更改为/\b\w+/g;如果您发现需要更复杂的正则表达式的情况,请发表评论。
  • 我将第 3 行正则表达式更改为 /\b[\w-\']+/g,以便允许在单词中使用连字符和撇号。
【解决方案6】:

我更喜欢以下答案而不是其他答案。它仅匹配每个单词的第一个字母并将其大写。更简单的代码,更容易阅读和更少的字节。它保留现有的大写字母以防止首字母缩略词失真。但是,您始终可以先在字符串上调用 toLowerCase()

function title(str) {
  return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

您可以将其添加到您的字符串原型中,这样您就可以'my string'.toTitle(),如下所示:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

示例:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

console.log('all lower case ->','all lower case'.toTitle());
console.log('ALL UPPER CASE ->','ALL UPPER CASE'.toTitle());
console.log("I'm a little teapot ->","I'm a little teapot".toTitle());

【讨论】:

  • 作为 lambda 更好看const titleCase = (str) =&gt; str.replace(/\b\S/g, t =&gt; t.toUpperCase());
  • 我不想破坏 IE,但是如果应用程序对旧版浏览器不敏感,它可能会更短。
  • 这只是部分解决方案 - op 询问如何将字符串转换为标题大小写。对于NoT qUiITe 之类的输入,此答案无法做到这一点。
  • @Madbreaks 该问题并未规定应转换混合大小写输入。但是,我已经更新了提到toLowerCase 的答案。请注意,它会破坏首字母缩略词。 an HTML document: An HTML Document vs An Html Document
  • @Madbreaks 虽然您最初的示例是人为设计的,但您明确指出如果输入大写,输出将保持不变。话虽如此,我觉得答案原样(编辑建议toLowerCase)比假设开发人员意图的答案更灵活/有用。该方法也体现了 PHP (ucwords) 和 Golang (strings.Title) 等其他语言的类似内置方法的功能。 .NET (TextInfo.ToTitleCase) 有趣地适用于混合大小写,但也会使完全大写的字符串保持不变。
【解决方案7】:

您可以立即toLowerCase 字符串,然后只需toUpperCase 每个单词的第一个字母。成为一个非常简单的 1 班轮:

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));

【讨论】:

  • 我喜欢这个解决方案;又好又简单。不过,您的答案中似乎包含了一些 CoffeeScript (s =&gt; s.toUpperCase())。我的变体是做你所做的,但扩展 String 对象(尽管有争议):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
  • @Waz,感谢您的想法!只是想澄清一下=&gt;,即native arrow function(ES6),链接跳转到它们上的Mozillla Docs,它也提供了一个支持表。
  • 非常感谢...寻找简短而准确的内容
【解决方案8】:

var result =
  'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())

console.log(result) // This Is Very Interesting

【讨论】:

  • 只是一个问题, () 构造用于指定对任何选项序列的匹配:即 (a|b) 匹配 a 或 b。构造 (.) 有什么作用?
  • 对于任何有相同问题的人,它定义了一个替换“blob”,用于替换部分。 blob 是按顺序编号的,第一个 () 放入 $1,第二个放入 $2。我发现这个网站很有用:javascript.info/tutorial/regular-expressions-methods
  • 我无法使上述方法正常工作,但我离正则表达式向导还很远。我再次使用'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}),这仅适用于将字符串的第一个字母大写,但如果这是您需要的,我的构造工作。
  • 由于某种原因,FF35 似乎在'$1'.toUpperCase() 上窒息,似乎在分配值时大写尚未完成。通过使用函数'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); }) 解决了
  • 大家好,答案是固定的!我很确定在我最初发布它时它正在工作。无论如何感谢您的意见!
【解决方案9】:

惊讶地发现没有人提到使用rest参数。这是一个使用 ES6 Rest 参数的简单单行。

let str="john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.log(str)

【讨论】:

    【解决方案10】:

    不使用正则表达式仅供参考:

    String.prototype.toProperCase = function() {
      var words = this.split(' ');
      var results = [];
      for (var i = 0; i < words.length; i++) {
        var letter = words[i].charAt(0).toUpperCase();
        results.push(letter + words[i].slice(1));
      }
      return results.join(' ');
    };
    
    console.log(
      'john smith'.toProperCase()
    )

    【讨论】:

    • 感谢您提供免费的正则表达式解决方案!
    【解决方案11】:

    基准测试

    TL;DR

    这个基准测试的赢家是普通的 for 循环:

    function titleize(str) {
        let upper = true
        let newStr = ""
        for (let i = 0, l = str.length; i < l; i++) {
            // Note that you can also check for all kinds of spaces  with
            // str[i].match(/\s/)
            if (str[i] == " ") {
                upper = true
                newStr += str[i]
                continue
            }
            newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
            upper = false
        }
        return newStr
    }
    // NOTE: you could beat that using charcode and string builder I guess.
    

    实际基准

    我选择了最流行和最独特的答案,并用这些回答a benchmark

    这是我的 MacBook pro 上的结果:

    为了完整起见,这里是使用的函数:

    str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
    function regex(str) {
      return str.replace(
        /\w\S*/g,
        function(txt) {
          return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
        }
      );
    }
    
    function split(str) {
      return str.
        split(' ').
        map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
        join(' ');
    }
    
    function complete(str) {
      var i, j, str, lowers, uppers;
      str = str.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
      });
    
      // Certain minor words should be left lowercase unless 
      // they are the first or last words in the string
      lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
      'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
      for (i = 0, j = lowers.length; i < j; i++)
        str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
          function(txt) {
            return txt.toLowerCase();
          });
    
      // Certain words such as initialisms or acronyms should be left uppercase
      uppers = ['Id', 'Tv'];
      for (i = 0, j = uppers.length; i < j; i++)
        str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
          uppers[i].toUpperCase());
    
      return str;
    }
    
    function firstLetterOnly(str) {
      return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
    }
    
    function forLoop(str) {
      let upper = true;
      let newStr = "";
      for (let i = 0, l = str.length; i < l; i++) {
        if (str[i] == " ") {
          upper = true;
            newStr += " ";
          continue;
        }
        newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
        upper = false;
      }
      return newStr;
    }
    

    请注意,我故意没有更改原型,因为我认为这是一种非常糟糕的做法,我认为我们不应该在回答中提倡这种做法。这仅适用于小型代码库,前提是您是唯一一个在处理它的人。

    如果您想在此基准测试中添加任何其他方法,请评论答案的链接!

    【讨论】:

      【解决方案12】:

      万一你担心那些填充词,你总是可以告诉函数什么不要大写。

      /**
       * @param String str The text to be converted to titleCase.
       * @param Array glue the words to leave in lowercase. 
       */
      var titleCase = function(str, glue){
          glue = (glue) ? glue : ['of', 'for', 'and'];
          return str.replace(/(\w)(\w*)/g, function(_, i, r){
              var j = i.toUpperCase() + (r != null ? r : "");
              return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
          });
      };
      

      希望对你有所帮助。

      编辑

      如果你想处理前导胶词,你可以用另外一个变量来跟踪这个:

      var titleCase = function(str, glue){
          glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
          var first = true;
          return str.replace(/(\w)(\w*)/g, function(_, i, r) {
              var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
              var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
              first = false;
              return result;
          });
      };
      

      【讨论】:

      • 你可以将一个字符串分解成一个数组。所以我们可以有葡萄牙语、西班牙语、意大利语和法语介词:glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
      • 这不能保证第一个单词的大小写;即and another thing 变为and Another Thing。只需要一种优雅的方式来始终将第一个单词大写。
      • @BradKoch - 用空格填充,以便您使用 ' and '、' de ' 等作为搜索词,然后 'And Another And Another' 将替换为 'And Another and Another' .
      • 很好,只是它在 ' 和之后的文本也大写 - 像 H'Dy 或 Number-One
      • 不使用三元运算符,您可以只使用后备:glue = glue || ['of', 'for', 'and', 'a'];
      【解决方案13】:

      如果上述解决方案中使用的正则表达式让您感到困惑,请尝试以下代码:

      function titleCase(str) {
        return str.split(' ').map(function(val){ 
          return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
        }).join(' ');
      }
      

      【讨论】:

      • 爱它!没有转换为数组。
      • uhhh... split 确实 将其转换为数组,您只是看不到它,因为map 意味着您不必使用[] 符号
      • 这与 2 年前的 a8m's answer 相同。
      • 单字符输入中断。
      • @AlexChaffee 检查修订历史。 a8m 在原始答案中没有使用箭头函数。
      【解决方案14】:

      如果您需要语法正确的答案:

      这个答案考虑了诸如“of”、“from”、..等介词。 输出将生成您希望在论文中看到的编辑风格标题。

      toTitleCase 函数

      考虑语法规则的函数listed here。 该函数还合并空格并删除特殊字符(根据需要修改正则表达式)

      const toTitleCase = (str) => {
        const articles = ['a', 'an', 'the'];
        const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
        const prepositions = [
          'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
          'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
        ];
      
        // The list of spacial characters can be tweaked here
        const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
        const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
        const normalizeStr = (str) => str.toLowerCase().trim();
        const shouldCapitalize = (word, fullWordList, posWithinStr) => {
          if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
            return true;
          }
      
          return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
        }
      
        str = replaceCharsWithSpace(str);
        str = normalizeStr(str);
      
        let words = str.split(' ');
        if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
          words = words.map(w => capitalizeFirstLetter(w));
        }
        else {
          for (let i = 0; i < words.length; i++) {
            words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
          }
        }
      
        return words.join(' ');
      }
      

      确保正确性的单元测试

      import { expect } from 'chai';
      import { toTitleCase } from '../../src/lib/stringHelper';
      
      describe('toTitleCase', () => {
        it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
          expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
          expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
          expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
        });
      
        it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
          expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
          expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
          expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
        });
      
        it('Replace special characters with space', function(){
          expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
          expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
        });
      
        it('Trim whitespace at beginning and end', function(){
          expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
        });
      
        it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
          expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
          expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
        });
      });
      

      请注意,我正在从提供的字符串中删除相当多的特殊字符。您需要调整正则表达式以满足项目的要求。

      【讨论】:

      【解决方案15】:

      我制作的这个函数可以处理姓氏(所以它不是标题大小写),例如“McDonald”或“MacDonald”或“O'Toole”或“D'Orazio”。但是,它不能处理带有“van”或“von”的德国或荷兰名称,这些名称通常是小写的……我相信“de”通常也是小写的,例如“Robert de Niro”。这些仍然需要解决。

      function toProperCase(s)
      {
        return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
                function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); });
      }
      

      【讨论】:

      • +1 用于名称意识。不过,也不能正确处理“梅​​西”。
      • 这是唯一能正确处理将大写和小写转换为正确大小写并注意到“美属维尔京群岛”之类的首字母的函数。
      • 你可以在macy 中放置一个否定的前瞻来绕过macy 的问题,所以\b((m)(a?c))?(\w) 变成\b((m)(a?c))?(\w)(?!\s)
      【解决方案16】:

      ES 6

      str.split(' ')
         .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
         .join(' ')
      

      其他

      str.split(' ').map(function (s) {
          return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
      }).join(' ')
      

      【讨论】:

      • 请注意,如果您仍然想要第一个字母,可能应该是s.slice(0, 1).toUpperCase()
      • @jssridhar 您还应该更正 ES6 中的代码。
      • 如果str 是单个字符则中断
      • @jssridhar 可能对我们更好.charAt(0).toUpperCase()
      • 重复 a8m 的答案
      【解决方案17】:

      如果您可以在代码中使用第三方库,那么 lodash 为我们提供了一个帮助函数。

      https://lodash.com/docs/4.17.3#startCase

      _.startCase('foo bar');
      // => 'Foo Bar'
      
      _.startCase('--foo-bar--');
      // => 'Foo Bar'
       
      _.startCase('fooBar');
      // => 'Foo Bar'
       
      _.startCase('__FOO_BAR__');
      // => 'FOO BAR'

      【讨论】:

        【解决方案18】:

        首先,将您的string 转换为splitting 的数组,然后使用空格:

        var words = str.split(' ');
        

        然后使用array.map 创建一个包含大写单词的新数组。

        var capitalized = words.map(function(word) {
            return word.charAt(0).toUpperCase() + word.substring(1, word.length);
        });
        

        然后join带有空格的新数组:

        capitalized.join(" ");
        

        function titleCase(str) {
          str = str.toLowerCase(); //ensure the HeLlo will become Hello at the end
          var words = str.split(" ");
        
          var capitalized = words.map(function(word) {
            return word.charAt(0).toUpperCase() + word.substring(1, word.length);
          });
          return capitalized.join(" ");
        }
        
        console.log(titleCase("I'm a little tea pot"));

        注意:

        这当然有一个缺点。这只会将每个单词的第一个字母大写。按单词,这意味着它将每个以空格分隔的字符串视为 1 个单词。

        假设你有:

        str = "I'm a little/small tea pot";

        这会产生

        我是个小/茶壶

        与预期相比

        我是一个小/小茶壶

        在这种情况下,使用 Regex 和 .replace 就可以了:

        使用 ES6:

        const capitalize = str => str.length
          ? str[0].toUpperCase() +
            str.slice(1).toLowerCase()
          : '';
        
        const escape = str => str.replace(/./g, c => `\\${c}`);
        const titleCase = (sentence, seps = ' _-/') => {
          let wordPattern = new RegExp(`[^${escape(seps)}]+`, 'g');
          
          return sentence.replace(wordPattern, capitalize);
        };
        console.log( titleCase("I'm a little/small tea pot.") );

        或者没有ES6

        function capitalize(str) {
          return str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase();
        }
        
        function titleCase(str) {
          return str.replace(/[^\ \/\-\_]+/g, capitalize);
        }
        
        console.log(titleCase("I'm a little/small tea pot."));

        【讨论】:

          【解决方案19】:
          var toMatch = "john w. smith";
          var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
                return i.toUpperCase() + (r != null ? r : "");
              }
          )
          

          似乎工作... 使用上述测试,“快速棕色,狐狸?/jumps/ ^over^ ¡懒惰!狗......”和“C:/program files/some vendor/the 2nd application/a file1.txt”。

          如果您想要 2Nd 而不是 2nd,您可以更改为 /([a-z])(\w*)/g

          第一种形式可以简化为:

          function toTitleCase(toTransform) {
            return toTransform.replace(/\b([a-z])/g, function (_, initial) {
                return initial.toUpperCase();
            });
          }
          

          【讨论】:

            【解决方案20】:

            这些答案中的大多数似乎都忽略了使用单词边界元字符 (\b) 的可能性。使用它的 Greg Dean 答案的简短版本:

            function toTitleCase(str)
            {
                return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
            }
            

            也适用于 Jim-Bob 等带连字符的名字。

            【讨论】:

            • 是一种优雅的部分解决方案,但不适用于重音或大写字符串。我得到“Sofía Vergara”=>“SofíA Vergara”或“Sofía VERGARA”=>“SofíA VERGARA”。第二种情况可以在 .replace(...) 之前使用 apply .toLowerCase() 函数来解决。第一种情况需要找到正确的正则表达式。
            • 嗯,这似乎是正则表达式实现中的一个错误,我认为重音字符应该是单词字符(不过你是对的,因为它不适用于这些情况)。跨度>
            • \w 仅包含字符 [A-Za-z0-9_],而不是所有字母。为此,您需要使用 Unicode 类别 \p{L}。您需要/u 修饰符(请参阅here)和\b 的不同解决方案,它仅适用于\W\w(请参阅here
            【解决方案21】:

            试试这个,最短的方法:

            str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());
            

            【讨论】:

            • 这很甜蜜。对于我拥有的基本用例(性能不一定是优先考虑的),这很完美!
            【解决方案22】:

            试试这个

            String.prototype.toProperCase = function(){
                return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, 
                    function($1){
                        return $1.toUpperCase();
                    }
                );
            };
            

            例子

            var str = 'john smith';
            str.toProperCase();
            

            【讨论】:

              【解决方案23】:

              我认为最简单的是使用 css。

              function format_str(str) {
                  str = str.toLowerCase();
                  return '<span style="text-transform: capitalize">'+ str +'</span>';
              }
              

              【讨论】:

              • 我更新了代码并测试了它。它现在应该可以工作了。
              • 您只能在使用 JS 的一小部分环境中使用 CSS,因此该解决方案不可行。此外,应不惜一切代价避免使用内联样式。
              • @Steve,它会通过toLowerCase()吗?
              【解决方案24】:
              "john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())
              

              【讨论】:

              • 适用于示例和o'henry,但对horse's mouth 做了一些奇怪的事情。
              • "john f. kennEdy".toLowerCase().replace(/\b\S/g, t =&gt; t.toUpperCase()) 更好?
              • 不想编辑@Proximo 的答案:\b\S 是特殊的character classes,表示“单词边界”和“单个非空白字符。因此,正则表达式匹配单词边界后的每个字符,并通过应用给定的箭头函数将该字符大写。
              【解决方案25】:

              这是一个非常简单简洁的 ES6 函数:

              const titleCase = (str) => {
                return str.replace(/\w\S*/g, (t) => { return t.charAt(0).toUpperCase() + t.substr(1).toLowerCase() });
              }
              
              export default titleCase;
              

              很好地包含在utilities 文件夹中,并按如下方式使用:

              import titleCase from './utilities/titleCase.js';
              
              const string = 'my title & string';
              
              console.log(titleCase(string)); //-> 'My Title & String'
              

              【讨论】:

              • 我不推荐使用 Lodash 的 startCase,因为它会去掉像 '&' 这样的字符
              【解决方案26】:

              使用/\S+/g 支持变音符号:

              function toTitleCase(str) {
                return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
              }
              
              console.log(toTitleCase("a city named örebro")); // A City Named Örebro

              但是:“sunshine (yellow)”⇒ “Sunshine (yellow)”

              【讨论】:

                【解决方案27】:

                这是我处理重音字符(对法语很重要!)的函数,它可以打开/关闭对降低异常的处理。希望对您有所帮助。

                String.prototype.titlecase = function(lang, withLowers = false) {
                    var i, string, lowers, uppers;
                
                    string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
                        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
                    }).replace(/Mc(.)/g, function(match, next) {
                        return 'Mc' + next.toUpperCase();
                    });
                
                    if (withLowers) {
                        if (lang == 'EN') {
                            lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
                        }
                        else {
                            lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
                        }
                        for (i = 0; i < lowers.length; i++) {
                            string = string.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) {
                                return txt.toLowerCase();
                            });
                        }
                    }
                
                    uppers = ['Id', 'R&d'];
                    for (i = 0; i < uppers.length; i++) {
                        string = string.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase());
                    }
                
                    return string;
                }
                

                【讨论】:

                  【解决方案28】:

                  采用“lewax00”解决方案,我创建了这个简单的解决方案,强制以空格开头的“w”或启动 de 单词的“w”,但无法删除额外的中间空格。

                  "SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });

                  结果是“Sofía Vergara”。

                  【讨论】:

                    【解决方案29】:

                    我们一直在办公室进行讨论,我们认为尝试自动纠正人们以您希望的当前方式输入姓名的方式可能会带来问题。

                    我们提出了几种不同类型的自动大写字母分崩离析的案例这些仅适用于英文名称,每种语言都有其自身的复杂性。

                    每个名字首字母大写的问题:

                    • 不允许输入IBM等首字母缩略词,会变成Ibm。

                    •麦当劳的名字会变成麦当劳,这是不正确的,同样的东西也是麦当劳。

                    • 像 Marie-Tonks 这样的双筒名称会变成 M​​arie-tonks。

                    • 像 O'Connor 这样的名字会变成 O'connor。

                    对于其中的大多数,您可以编写自定义规则来处理它,但是,这仍然像以前一样存在 Acronyms 的问题,并且您会遇到一个新问题:

                    • 添加一条规则来修复 Mac 的名称(例如 MacDonald),是否会破坏名称(例如 Macy)将其变成 MacY。

                    我们提出的唯一永远不会错误的解决方案是将每个字母大写,这是 DBS 似乎也使用的蛮力方法。

                    因此,如果您想使流程自动化,那么如果没有包含每个名称和单词以及应如何大写的字典,那几乎是不可能的,如果您没有涵盖所有内容的规则,请不要'不要使用它,因为它只会惹恼您的用户并提示想要正确输入其姓名的人去其他地方。

                    【讨论】:

                    • 您可以测试输入字符串是否已经正确大小写,并且只有当它不是(例如全部小写或全部大写)时才使用您的尽力算法更改大小写
                    【解决方案30】:

                    这是另一个使用 css(和 javascript,如果要转换的文本是大写的)的解决方案:

                    html

                    <span id='text'>JOHN SMITH</span>
                    

                    js

                    var str = document.getElementById('text').innerHtml;
                    var return_text = str.toLowerCase();
                    

                    css

                    #text{text-transform:capitalize;}
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2010-11-15
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多