在Javascript中拆分帕斯卡命名法(特定情况)

12
我一直在尝试使用JavaScript正则表达式将类似于EYDLessThan5Days的内容转换为EYD Less Than 5 Days。你有什么想法吗?
我使用的代码:
"EYDLessThan5Days"
    .replace(/([A-Z])/g, ' $1')
    .replace(/^./, function(str){ return str.toUpperCase(); });

输出:E Y D 少于5天
但仍然给我错误的结果。

请帮助我。谢谢。

3个回答

26

尝试使用下面的函数,它可以处理你能找到的所有字符串类型。如果你发现了任何缺陷,请在评论中指出。

function camelPad(str){ return str
    // Look for long acronyms and filter out the last letter
    .replace(/([A-Z]+)([A-Z][a-z])/g, ' $1 $2')
    // Look for lower-case letters followed by upper-case letters
    .replace(/([a-z\d])([A-Z])/g, '$1 $2')
    // Look for lower-case letters followed by numbers
    .replace(/([a-zA-Z])(\d)/g, '$1 $2')
    .replace(/^./, function(str){ return str.toUpperCase(); })
    // Remove any white space left around the word
    .trim();
}

// Test cases
document.body.appendChild(document.createTextNode(camelPad("EYDLessThan5Days")));
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(camelPad("LOLAllDayFrom10To9")));
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(camelPad("ILikeToStayUpTil9O'clock")));
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(camelPad("WhatRYouDoing?")));
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(camelPad("ABC")));
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(camelPad("ABCDEF")));


谢谢@djdavid98,你的解决方案可以解决我所有的测试用例。 - Naval Navc
这个不适用于三个字母缩写,比如“ABC”,它会将其转换为“AB C”。 - RoboDev
2
@Superdumbell,请检查我的编辑,我相信它可以满足你的需求。 - SeinopSys

12
这对你有帮助。
"EYDLessThan5Days".replace(/([A-Z][a-z])/g,' $1').replace(/(\d)/g,' $1');

我将为您提供“EYD少于5天”的信息。

我在这里做什么

replace(/([A-Z][a-z])/g,' $1')

如果大写字母后面跟着小写字母,那么在它前面加一个空格。
replace(/(\d)/g,' $1')

如果有数字,请在其前面添加空格。

3
我看到你的回答唯一的问题是,op只提供了字符串作为示例,虽然你的代码对于这个特定的示例确实有效,但如果字符串是 "It'sOver9000And1",它将变成 "It's Over 9000 And1",因为缺少"g"标志,但如果你添加它,那么它将变成 "It's Over 9 0 0 0 And 1"。只要字符串中只有一个数字,它就可以工作,但另一个失败的情况是 "IAmAGuy",保留"I"和"A",因为它后面没有小写字母。 - SeinopSys

4

我正在寻找解决方案,并偶然发现了这篇文章。最终使用了lodash库。

对于那些不想使用正则表达式的人,lodash库中有一个名为"startCase"的方法。

https://lodash.com/docs/4.17.15#startCase

_.startCase('EYDLessThan5Days'); // "EYD Less Than 5 Days"

对于那些不想为了这个“函数”而安装npm i lodash的人,可以使用npm i lodash.startcase - CodeFinity

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