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

Javascript Capitalize first letter of each word ignore Contractions

我正在尝试将字符串中每个单词的首字母大写。我在网上发现了类似的问题,但 none 似乎回答了我忽略像 can't、won't、wasn't 这样的缩略语的问题。

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

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

如果字符串包含 can't 或 won't 之类的缩写,它将输出 Can'T 或 Won'T。

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

您可以使用

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 demo详情:

  • ([\W_]|^) - 第 1 组 (x):一个 non-alphanumeric 字符或字符串开头
  • (\w) - 第 2 组 (y):单词 char
  • (?<!\w'\w) - 负向回顾,确保第 2 组值前面没有字符字符和 '.

您可以使用 negative lookbehind 来确保单词边界前没有撇号。 (?:\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()));
});

此 RegExp 检测

  • 第一个符号
  • 下划线
  • Space
  • /符号
  • 逗号
  • 撇号

只需在列表中使用 | 分隔符

添加需要的符号
str.replace(/((^|_| |\/|,|')\w)/g, w => w.toUpperCase());