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


9

我试图在打字稿中创建一个管道,该管道将拆分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();
易卜拉欣·莫里尔

2
@ibrahimmahrir (?!^)([A-Z]|\d+)避免了第一个空格,不需要修剪。
ctwheels

Answers:


6

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

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+但是这样会破坏如ABCDefg123A B C Defg 123这将是不同的工作,以你目前的功能,即变换来ABC Defg 123

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


1
出色,通过了我所有的测试案例。我同意,您的更为准确。我真的很感激!
develmatik

@develmatik高兴它可以按需工作,我刚刚读到了骆驼与PascalCase的区别:)
泡泡

3

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

// ...

return value.replace(/(?!^)([A-Z]|\d+)/g, " $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(' ')
);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.