我正在JavaScript/Node JS程序中使用以下规则生成一些有意义的名称:
输入:">tenancy_account__accountPublicId__workspace__workspacePublicId_remove-user__userPublicId">
预期输出:"TenancyAccountAccountPublicIdWorkspaceWorkspacePublicIdRemove-userUserPublicId";
规则:
- 将任何带有零或更多下划线的字符替换为无下划线的大写字母示例:
x | __*x => X
- 如果存在,最后删除_
这是迄今为止尝试的,寻找更好的替代品,如果有的话:
const convertBetterString = (input) => {
const finalString = [];
if (input && input.includes('_')) {
const inputStringSeparation = input.split('_');
if (inputStringSeparation.length > 1) {
if (inputStringSeparation[inputStringSeparation.length - 1] === '') {
inputStringSeparation.splice(inputStringSeparation.length - 1, 1);
}
inputStringSeparation.forEach((val, index) => {
if (val === '' && inputStringSeparation[index + 1]) {
const actualString = inputStringSeparation[index + 1];
const formattedString = actualString.charAt(0).toUpperCase() + actualString.slice(1);
finalString.push(formattedString);
}
});
return finalString.length > 0 ? finalString.join('') : inputStringSeparation.join('');
} else {
return input.charAt(0).toUpperCase() + input.slice(1);
}
} else {
return input;
}
}
拆分和切片
const capitalise = str => str.slice(0,1).toUpperCase() + str.slice(1); // you can add more tests
const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId"
const newStr = str.split(/_+/)
.map(word => capitalise(word))
.join("")
console.log(newStr)
Regexp与可选的链接
const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId_"
const newStr = str.replace(/(?:_+|^)(w)?/g, (_,letter) => letter?.toUpperCase() ?? "")
console.log(newStr)
解释
(?:_+|^)
未捕获下划线或以(w)?
开头,后跟0或1个要捕获的字母(_,letter) => letter?.toUpperCase() ?? "")
忽略匹配项并在找到字母时将其大写,这也会忽略尾部下划线
您可以使用
const str = "tenancy_account__accountPublicId__workspace__workspacePublicId__remove-user__userPublicId__";
const newStr = str
.replace(/(?:^|_)_*([^s_])|_+$/g, (_, x) => x ? x.toUpperCase() : '')
console.log(newStr);
/(?:^|_)_*([^s_])|_+$/g
正则表达式匹配的所有出现
(?:^|_)
-字符串或_
的开头_*
-零个或多个下划线([^s_])
-组1:除空白和_
之外的任何字符|
-或_+$
-字符串末尾的一个或多个_
(_, x) => x ? x.toUpperCase() : ''
替换将删除所有下划线(即使它们位于字符串末尾(,并将Group 1值(x
(改为大写。