使用正则表达式 replace() 方法一步删除定界符并将第一个字母大写

Using regex replace() method to remove delimiters and capitalise first letters in one step

在尝试删除所有下划线分隔符并将首字母转换为大写时,我开发了以下函数(也可在此代码笔中使用:http://codepen.io/PiotrBerebecki/pen/RRKjex)。

Objective:

给定 'this_is_some_text' 作为输入字符串,函数应该 return 'ThisIsSomeText'.

工作 JS 代码:

function capitaliseFirst(str) {
  var firstCapital = str.replace(/[a-z]+/g, x => x[0].toUpperCase() + x.slice(1));
  return firstCapital.replace(/_/g, '')
}

console.log( capitaliseFirst('this_is_some_text') ); // returns ThisIsSomeText

上面的函数实现了想要的 objective,但是我想重构它,只需要一个 replace() 方法。目前我被困在下面的代码中。您知道如何完成吗?

不工作(还)JS代码:

function capitaliseFirst2(str) {
  return str.replace(/(?:_)?([a-z])/g, '')
}

console.log( capitaliseFirst2('some_other_text') ); // should return SomeOtherText

这是一种方法:

function capitaliseFirst2(str) {
    return str.replace(/(?:_+|^)(.)/g, (m0, m1) => m1.toUpperCase());
}

我们匹配并大写 1 个或多个下划线之后或字符串开头的每个字符。

我建议您不要使用正则表达式,而只是编写代码:

function capitaliseFirst2(str) {
  return str.split('_').map(function(w) {
    return w.charAt(0).toUpperCase() + w.slice(1);
  }).reduce(function(a, b) {
    return (a + b)
  });
}

与正则表达式相比,我不确定性能问题,但它比正则表达式更具可读性。

关于 Array.forEach 函数使用 ES6 箭头函数的另一个简短解决方案:

var str = 'this_is_some_text', capitalized = "";
    str.split("_").forEach((s) => (capitalized += s[0].toUpperCase() + s.slice(1)));

console.log(capitalized);  // "ThisIsSomeText"