Javascript将每个单词的第一个字母大写,忽略缩写



我正在尝试将字符串中每个单词的第一个字母大写。我在网上发现了类似的问题,但似乎没有一个能回答我忽视合同的问题,比如不能、不会、不是。

这段代码很有效,但它也将缩写中撇号后面的字母大写。

var str = str.replace(/bw/g, w => w.toUpperCase())

如果字符串包含类似can't或won't的收缩,它将输出can't或won’t。

有没有办法忽略单词中间的撇号?我仍然想把用其他标点符号分隔的单词大写。例如:

  • this_is_an_example->This_Is_An_Example
  • this/is/an/example->此/Is/An/示例
  • 这是一个例子->This,Is,An,Example

您可以使用

const texts = ["this_can't_be_an_example", 'this/is/an/example', 'this,is,an,example']
for (const text of texts) {
console.log(text, '=>', text.replace(/([W_]|^)(w)(?<!w'w)/g, (_, x,y) => `${x}${y.toUpperCase()}` ))
}

请参阅regex演示详细信息

  • ([W_]|^)-组1(x(:非字母数字字符或字符串的开头
  • (w)-组2(y(:一个词的字符
  • (?<!w'w)-一个负查找,确保Group 2值前面没有单词char和'

此RegExp检测

  • 第一个符号
  • 下划线
  • 空间
  • /符号
  • Comma
  • 撇号

只需使用|分隔符在列表中添加所需符号

str.replace(/((^|_| |/|,|')w)/g, w => w.toUpperCase());

您可以使用负查找来确保单词边界之前没有撇号。(?:b|(?<=_))检查单词边界或单词前面的下划线。

const examples = [
"can't",
"this-is-an-example",
"this.is.an.example",
"this/is/an/example",
"this_is_an_example",
"this,is,an,example",
];
examples.forEach(example => {
console.log(example.replace(/(?<!')(?:b|(?<=_))w/g, w => w.toUpperCase()));
});

最新更新