将一个字符串按大写字母或数字分割

13

我试图在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;
    }

比如说一个字符串 ANet15Amount,应该被转换成 A Net 15 Amount。上面的正则表达式也可以分割camelCase字符串,但这不是必须考虑的。


.replace(/([A-Z]|\d+)/g, " $1").trim(); - ibrahim mahrir
2
@ibrahimmahrir (?!^)([A-Z]|\d+) 避免第一个空格并且不需要修剪。 - ctwheels
4个回答

12

如何使用更基本的模式像这样进行匹配,并用空格连接

let str = `ANet15Amount`;

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

console.log(camel);

起初我想简单地使用[A-Z][a-z]*|\d+,但这会将ABCDefg123分成A B C Defg 123,与您当前的函数不同,该函数将其转换为ABC Defg 123

仍有一点差异。您的函数将A1B2转换为A 1B 2,而这个函数将其转换为A 1 B 2,我认为后者更准确,不是吗。


1
太棒了,通过了我所有的测试用例。我同意,你的更准确。真的非常感谢! - pearcebdev
@develmatik 很高兴它按预期工作,我刚刚了解了Camel与PascalCase的区别 :) - bobble bubble

6

只需将任何大写字母[A-Z]或任何数字序列\d+替换为一个空格加上我们刚刚匹配的内容" $1"。 我们跳过第一个字母,以便在字符串开头不添加空格,通过在字符串起始处添加负向先行断言(?!^)

// ...

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

例子:

let value = "ANet15Amount";

let result = value.replace(/(?!^)([A-Z]|\d+)/g, " $1");

console.log(result);


2

尝试使用正则表达式[A-Z]?[a-z]+|[A-Z]|[0-9]+

  • 0或1个大写字母直接跟随1个或多个小写字母
  • 或1个大写字母
  • 或1个或多个数字

在生成器中测试: https://regex101.com/r/uBO0P5/1


2

我想这取决于字符串的约定,这可能会增加复杂性。

// here 'TIMES' & 'with' are seperated (example 2)
const str = 'SplittingStringsIsFunTimesA100000aaaTIMESwithFollowUp';

// here 'TIMES' & 'With' are seperated (exmpaple 3)
const str2 = 'SplittingStringsIsFunTimesA100000aaaTIMESWithCAPITAL5FollowUp';


// 1. USING REGEX - MATCH
console.log(
  '1. USING REGEX:\n',
  str
  .match(/(\d+|[a-z]+|[A-Z][a-z]*)/g)
  .join(' ')
);


// 2. USING REGEX - MATCH (KEEP ALL CAPITAL CHARS)
console.log(
  '2. USING REGEX (GROUP ALL):\n',
  str
  .match(/(\d+|[a-z]+|([A-Z]([A-Z]+|[a-z]*)))/g)
  .join(' ')
);

// 3. USING REGEX - MATCH (KEEP CAPITAL CHARS BUT LAST)
console.log(
  '3. USING REGEX (GROUP BUT LAST):\n',
  str2
  .match(/(\d+|[a-z]+|([A-Z]([a-z]+|([A-Z]+(?![a-z]))?)))/g)
  .join(' ')
);


// 4. USING SPLIT - FILTER
console.log(
  '4. USING SPLIT:\n',
  str2
  .split(/(\d+|[A-Z][a-z]*)/)
  .filter(v => v !== '')
  .join(' ')
);


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