在大写字母或数字上分割字符串

dev*_*tik 9 javascript regex typescript

我试图在打字稿中创建一个管道,该管道将拆分PascalCase字符串,但是如果这也可以拆分为数字,那将很好。我也希望将其分成连续的大写字母。我有这个管道,除了只在Chrome而不是Firefox中工作之外,它运作得很好,显然只有Chrome支持回溯。如何做到这一点而无需回头?

transform(value: string): string {
        let extracted = '';
        if (!value) {
            return extracted;
        }

        const regExSplit = value
            .split(new RegExp('(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[0-9])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9])'));
        for (let i = 0; i < regExSplit.length; i++) {
            if (i !== regExSplit.length - 1) {
                extracted += `${regExSplit[i]} `;
            } else {
                extracted += regExSplit[i];
            }
        }

        return extracted;
    }
Run Code Online (Sandbox Code Playgroud)

因此,例如,字符串ANet15Amount应转换为A Net 15 Amount。上面的此正则表达式也会拆分camelCase字符串,但这不是必须考虑的。

bob*_*ble 6

如何匹配由更基本的模式是这样,并加入与空间。

let str = `ANet15Amount`;

let camel = str.match(/[A-Z]+(?![a-z])|[A-Z]?[a-z]+|\d+/g).join(' ');

console.log(camel);
Run Code Online (Sandbox Code Playgroud)

首先,我想简单地[A-Z][a-z]*|\d+但是这样会破坏如ABCDefg123A B C Defg 123这将是不同的工作,以你目前的功能,即变换来ABC Defg 123

仍然有一点区别。您的转换A1B2到了A 1B 2这个A 1 B 2,我认为这个会更准确,不是吗。


ibr*_*rir 5

只需用空格加上我们刚刚匹配的内容替换任何大写字母[A-Z]或任何数字序列。我们跳过第一个字母,这样就不会通过在字符串的开头添加负前瞻来在结果字符串的开头添加空格:\d+" $1"(?!^)

// ...

return value.replace(/(?!^)([A-Z]|\d+)/g, " $1");
Run Code Online (Sandbox Code Playgroud)

例子:

// ...

return value.replace(/(?!^)([A-Z]|\d+)/g, " $1");
Run Code Online (Sandbox Code Playgroud)