【问题标题】:Split string to CamelCase words and also uppercase acronymns将字符串拆分为 CamelCase 单词和大写首字母缩写词
【发布时间】:2020-02-28 00:34:17
【问题描述】:

给定一个包含 CamelCase 和大写首字母缩写词的字符串,例如'ManualABCTask';

如何以不那么冗长的方式将其拆分为所有单词和首字母缩写词之间有空格的字符串?

我有以下过程:

let initial = 'ManualABCTask'
//Split on single upper case followed by any number of lower case:
.split(/(['A-Z'][a-z]*)/g)
//the returned array includes empty string entries e.g. ["", "", "Manual", "A", "", "B", "", "C","", "Task", ""] so remove these:
.filter(x => x != '');

//When joining the array, the acronymn uppercase single letters have a space e.g. 'Manual A B C Task' so instead, reduce and add space only if array entry has more than one character
 let word = initial.reduce((prevVal,currVal) => {
    return  (currVal.length == 1) ? prevVal + currVal  : prevVal + ' ' + currVal + ' ';
}, '');

这可以完成所需的组合,例如:

  • 'ManualABCTask' => '手动 ABC 任务'
  • 'ABCManualTask​​' => 'ABC 手动任务'
  • 'ABCManualDEFTask' => 'ABC 手动 DEF 任务'

但是完成这项工作的代码很多,而且肯定可以在初始正则表达式中处理。

我在写问题的同时进行了实验,并对正则表达式进行了调整,将其简化为一行,有了很大的改进!所以无论如何都要发布解决方案。

我的正则表达式不太好,所以这可能还可以改进。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    我对@9​​87654321@ 几乎一无所知,但我对此很感兴趣:

    let initial = 'ManualABCTask'
    initial = initial.replace(/([A-Z][a-z]+)/g, ' $1 ').trim();
    

    【讨论】:

    • 很简洁
    • @JMP,谢谢。工作和探索 JavaScript 很有趣。希望它能帮到你。
    【解决方案2】:

    有 2 组:从首字母开始,后面跟着小写,从首字母开始直到下一个字母不是小写:

    find = new RegExp(
        "(" +
        "[A-Z][a-z]+" +  // Group starting from head letter with following lowercases
        "|" +
        "[A-Z]+(?![a-z])" +  // Group with head letters until next letter isn't lowercase:
        ")",
        "g"
    )
    initial = 'ManualABCTask'.split(find)
    

    【讨论】:

    • 是的,这也能解决问题。我得好好看看它是怎么做的,谢谢。
    • 如果没有这个否定检查 (?![a-z]) 带有头字母的组会得到一个额外的字母,例如 ABCT
    【解决方案3】:

    如帖子中所述,更改为在正则表达式中处理:

      initial = 'ManualABCTask'.split(/(['A-Z']{2,99})(['A-Z'][a-z]*)/g).join(' ');
    

    将长度为 2 到 99 的任何并发大写字符分组以获得首字母缩略词,并将任何单个大写字符后跟任意数量的小写字符以获得其他单词。加入空格。

    【讨论】:

    • 你应该可以使用{2,} 没有上限。
    • 以为会被捡起来的!我最初使用了不正确的语法,所以将 99 插入。没有意识到它在逗号之后只需要空,现在看起来很明显。谢谢。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多