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

Posted

技术标签:

【中文标题】在大写字母或数字上拆分字符串【英文标题】:Split a string on a capital letter or numbers 【发布时间】:2020-03-10 16:30:39 【问题描述】:

我试图在打字稿中制作一个可以拆分 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。上面的这个正则表达式也会拆分一个驼峰式字符串,但这没有必要考虑。

【问题讨论】:

.replace(/([A-Z]|\d+)/g, " $1").trim(); @ibrahimmahrir (?!^)([A-Z]|\d+) 避免了第一个空格并且不需要修剪。 【参考方案1】:

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

// 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(' ')
);

【讨论】:

【参考方案2】:

matching 用一个更基本的模式 like this 和 joining 与空格怎么样。

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,我认为这个会更准确,不是吗。

【讨论】:

太棒了,通过了我所有的测试用例。我同意,你的更准确。我真的很感激! @develmatik 很高兴它可以按要求工作,我刚刚读到了 Camel 与 PascalCase 的区别 :)【参考方案3】:

只需将任何大写字母[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);

【讨论】:

【参考方案4】:

试试[A-Z]?[a-z]+|[A-Z]|[0-9]+

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

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

【讨论】:

以上是关于在大写字母或数字上拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

PHP:将字符串拆分为数组 foreach char

c ++在非字母字符上拆分字符串

熊猫:除非在点之前有数字或字符,否则在点上拆分

使用 VBA 解析和拆分带有通配符的字符串?

根据字符串或字母将字符串拆分为多个值?

用大写单词拆分字符串[关闭]