我有一些像“Light Purple”和“Dark Red”这样的词,它们存储为“LightPurple”和“DarkRed”。如何检查诸如“LightPurple”之类的单词中的大写字母,并在“Light”和“Purple”两个单词之间放置一个空格以形成“Light Purple”一词。
在此先感谢您的帮助
我有一些像“Light Purple”和“Dark Red”这样的词,它们存储为“LightPurple”和“DarkRed”。如何检查诸如“LightPurple”之类的单词中的大写字母,并在“Light”和“Purple”两个单词之间放置一个空格以形成“Light Purple”一词。
在此先感谢您的帮助
您可以使用正则表达式在大写字母旁边有小写字母的地方添加空格。
像这样的东西:
"LightPurple".replace(/([a-z])([A-Z])/, '$1 $2')
更新:如果你有两个以上的单词,那么你需要使用g
标志来匹配它们。
"LightPurpleCar".replace(/([a-z])([A-Z])/g, '$1 $2')
更新 2:如果试图拆分单词CSVFile
,那么您可能需要使用此正则表达式:
"CSVFilesAreCool".replace(/([a-zA-Z])([A-Z])([a-z])/g, '$1 $2$3')
好的,分享一下我的经验。我也有其他语言的这个工具,它工作得很好。对你来说,我刚刚创建了一个带有示例的 javascript 版本,所以你试试这个:
var camelCase = "LightPurple";
var tmp = camelCase[0];
for (i = 1; i < camelCase.length; i++)
{
var hasNextCap = false;
var hasPrevCap = false;
var charValue = camelCase.charCodeAt(i);
if (charValue > 64 && charValue < 91)
{
if (camelCase.length > i + 1)
{
var next_charValue = camelCase.charCodeAt(i + 1);
if (next_charValue > 64 && next_charValue < 91)
hasNextCap = true;
}
if (i - 1 > -1)
{
var prev_charValue = camelCase.charCodeAt(i - 1);
if (prev_charValue > 64 && prev_charValue < 91)
hasPrevCap = true;
}
if (i < camelCase.length-1 &&
(!(hasNextCap && hasPrevCap || hasPrevCap)
|| (hasPrevCap && !hasNextCap)))
tmp += " ";
}
tmp += camelCase[i];
}
这是演示。
您可以将每个字符与一串大写字母进行比较。
function splitAtUpperCase(input){
var uppers = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//start at 1 because 0 is always uppercase
for (var i=1; i<input.length; i++){
if (uppers.indexOf(input.charAt(i)) != -1){
//the uppercase letter is at i
return [input.substring(0,i),input.substring(i,input.length)];
}
}
}
输出是一个包含第一个和第二个单词的数组。
我认为这绝对不是解决这个问题的最佳方法(从优化的角度来看)。但它有效:)
const createSpacesBetweenWords = (char, index) => {
if (char === char.toUpperCase() && index > 0) {
return ` ${char}`;
}
return char;
};
function formatString(string) {
return string
.split('')
.map(createSpacesBetweenWords)
.join('');
}
formatString('LightPurple'); //returns a new string where words are separated by spaces