【问题标题】:Replace underscores with spaces and capitalize words用空格替换下划线并将单词大写
【发布时间】:2014-02-15 01:40:48
【问题描述】:

我正在尝试创建一种方法,将带有小写字母和下划线的文本转换为不带下划线的文本,并且每个单词的首字母大写。

前;

options_page = Options Page

在这个页面:How to make first character uppercase of all words in JavaScript?

我找到了这个正则表达式:

key = key.replace(/(?:_| |\b)(\w)/g, function(key, p1) { return p1.toUpperCase()});

除了用空格替换下划线之外,这一切都做了。我没有真正尝试过任何东西,因为我对正则表达式不太熟悉。

如何调整此正则表达式,以便将下划线替换为空格?

【问题讨论】:

  • 对于那些正在使用 lodash 的人,有startCase 功能

标签: javascript regex


【解决方案1】:

这应该可以解决问题:

function humanize(str) {
  var i, frags = str.split('_');
  for (i=0; i<frags.length; i++) {
    frags[i] = frags[i].charAt(0).toUpperCase() + frags[i].slice(1);
  }
  return frags.join(' ');
}


console.log(humanize('humpdey_dumpdey'));
// > Humpdey Dumpdey

回复

http://repl.it/OnE

小提琴

http://jsfiddle.net/marionebl/nf4NG/

jsPerf

大部分测试数据http://jsperf.com/string-transformations

所有版本加上 _.strhttp://jsperf.com/string-transformations/3

【讨论】:

  • 我同意你的代码大小,但根据我的tests str.split 在大多数浏览器中要快得多。
  • 代码大小为 131111 丑化并定义为 function humanize 时的字节数。
  • 有趣的结果!我需要修改我的做法。
  • 快 20 倍。不错。
  • 即时可读/可理解的代码,比正则表达式更快。谁会想到这可能?
【解决方案2】:

从 Lodash 3.1.0 开始,有一个 _.startCase([string='']) 方法可以将任何大小写转换为大写单词(起始大小写):

_.startCase('hello_world'); // returns 'Hello World'
_.startCase('hello-world'); // returns 'Hello World'
_.startCase('hello world'); // returns 'Hello World'

Lodash 的 String 部分还有其他有用的方法。阅读文档here

【讨论】:

  • 旁注:如果你只想导入这个函数而不是整个库,你可以在文件顶部使用 import startCase from 'lodash/startCase' 而不是导入整个库,如果你只是将它用于这件事。
【解决方案3】:

这是两个不同的任务,所以两个不同的正则表达式是最好的解决方案:

key = key.replace(/_/g, ' ').replace(/(?: |\b)(\w)/g, function(key) { return key.toUpperCase()});

确保处理所有大写单词。您可以在第一个.replace 之前添加.toLowerCase()

console.log('TESTING_WORD'.toLowerCase().replace(/_/g, ' ')
.replace(/(?: |\b)(\w)/g, function(key, p1) {
    return key.toUpperCase();    
}));

【讨论】:

  • 您可以从第二个正则表达式中删除下划线,因为它们都已被删除。
  • 感谢您的回答。不幸的是,它产生的结果与以前相同。 contact_details = ContactDetails;它没有把空间放在那里。
  • 对,我没有注意到第二个正则表达式也删除了空格。我已经编辑了代码以更改该功能。现在它按预期工作了,您可以查看here
  • 为了更好,您可以在第一个 key.replace 之前添加 key.toLowerCase() 以确保处理所有大写单词。
【解决方案4】:

另一种选择:

camel = "options_page".replace(/(^|_)(\w)/g, function ($0, $1, $2) {
  return ($1 && ' ') + $2.toUpperCase();
});
console.log(camel);

正则表达式:

(^|_)   beginning of the input OR "_" ($1)
(\w)    a word character (short for [a-zA-Z0-9_]) ($2)
g       all occurrences (global)

更多关于正则表达式:http://www.javascriptkit.com/javatutors/redev.shtml.

【讨论】:

    【解决方案5】:

    这里:

    var str = 'Lorem_ipsum_dolor_sit_amet,_consectetur____adipiscing_elit.'
    str = str.replace(/_{1,}/g,' ').replace(/(\s{1,}|\b)(\w)/g, function(m, space, letter)
    {
      return space + letter.toUpperCase();
    })
    
    console.log(str);
    

    【讨论】:

      【解决方案6】:

      只需添加 .replace('_',' ')

      喜欢这个

      function toCamel(string){
        return string.replace(/(?:_| |\b)(\w)/g, function($1){return $1.toUpperCase().replace('_',' ');});
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-30
        • 2022-11-21
        • 2011-07-12
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多