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

4
我正在使用以下规则在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;
    }
}

s.replaceAll('__', '_').split('_').map(str => str.charAt(0).toUpperCase() + str.slice(1)).join('') - A1exandr Belan
2个回答

4

分割与切片

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)

可选链的正则表达式

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() ?? "") 如果有匹配到字母,则忽略匹配并将其转换为大写字母。这也会忽略末尾的下划线。


2

您可以使用

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_]) - 第一组:除空格和_以外的任意字符。
  • | - 或
  • _+$ - 字符串末尾一个或多个_
(_, x) => x ? x.toUpperCase() : ''替换操作会删除所有下划线(即使它们在字符串末尾),并将第一组的值(x)转换为大写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接