我正在尝试将字符串中每个单词的第一个字母大写。我在网上发现了类似的问题,但似乎没有一个能回答我忽视合同的问题,比如不能、不会、不是。
这段代码很有效,但它也将缩写中撇号后面的字母大写。
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()));
});