通过JavaScript正则表达式进行复杂的字符串操作



我正在JavaScript/Node JS程序中使用以下规则生成一些有意义的名称:

输入:">tenancy_account__accountPublicId__workspace__workspacePublicId_remove-user__userPublicId">

预期输出:"TenancyAccountAccountPublicIdWorkspaceWorkspacePublicIdRemove-userUserPublicId";

规则:

  1. 将任何带有零或更多下划线的字符替换为无下划线的大写字母示例:x | __*x => X
  2. 如果存在,最后删除_

这是迄今为止尝试的,寻找更好的替代品,如果有的话:

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(改为大写。

最新更新