函数应该将一个字符串作为参数并使用驼峰的情况。我在使用regex和string.replace()方法时遇到连字符问题。
camelCase('最先进的')应该返回最先进的' camelCase("不要担心kyoko")应该返回" dontWorryKyoko"
以下两种情况都适用,但我想将其设为DRY,取出连字符if子句,并在.replace()中包含连字符大小写并回拨它。
function camelCase(phrase) {
let re = /[a-z]+/i;
let hyphens = /[-+]/g
if(typeof phrase !== 'string' || !phrase.match(re) || !phrase || phrase === null){
return "Please enter a valid string.";
} else if (phrase.match(hyphens)){
return phrase.toLocaleLowerCase();
}else{
return phrase.replace(/(?:^\w+|[A-Z]|\s+\w)/g, function(letter, index) {
return index == 0 ? letter.toLowerCase() : letter.toUpperCase();
}).replace(/\W+/g, '');
}
}
console.log(camelCase('state-of-the-art')) // 'state-of-the-art'
console.log(camelCase("Don't look back")) // dontLookBack
我们可以让连字符案例在没有连字符if子句的情况下工作吗?
另外我觉得camelCase("don't lOOk_BaCK")
应该是小写字母,索引> 0但它似乎没有在控制台中这样做。
有人想帮忙吗?感谢名单
答案 0 :(得分:1)
要解决连字符问题,您可以在适当情况下使用-
或[\w-]
将[^\w-]
视为字母数字类的一部分。
要将所有非首字母小写,我建议将所有字词与(\S)(\S*)
大写字母$1
(如果适用)和小写字母$2
匹配:
function camelCase(phrase) {
return phrase.replace(/[^\w-]*(\S)(\S+)/g, function(_, first, rest, index) {
return (index ? first.toUpperCase() : first.toLowerCase())
+ rest.toLowerCase();
}).replace(/[^\w-]+/g, "");
}
console.log(camelCase("state-of-the-art"));
console.log(camelCase("-state-of-the-art"));
console.log(camelCase("Don't look back"));
console.log(camelCase("don't lOOk_BaCK"));
console.log(camelCase("???don't lOOk_BaCK"));

答案 1 :(得分:0)
您可以通过添加否定前瞻断言.replace(/(?!-)\W+/g, '');
来使连字符起作用。这将告诉它替换除-
短划线字符之外的所有非单词字符。
关于您的下层问题:现在判断案例的唯一标准是它是否出现在字符串的开头。否则你就是UPPER套管所有东西(包括大写的匹配)。这也是一个非常简单的解决方案。这就是整个事情:
function camelCase(phrase) {
let re = /[a-z]+/i;
if (typeof phrase !== 'string' || !phrase.match(re) || !phrase || phrase === null) {
return "Please enter a valid string.";
} else {
return phrase.replace(/(?:^\w+|(\s+)\w)|[A-Z]/g, function (letter, sp, index) {
console.log(letter, sp, index);
return (index == 0 || sp === undefined) ? letter.toLowerCase() : letter.toUpperCase();
}).replace(/(?!-)\W+/g, '');
}
}
更改说明:
phrase.replace
正则表达式中的断言顺序。我们希望空格词组合优先于大写的匹配。index===0
)[A-Z]
匹配,没有前面的空格)另外,对于_
下划线字符,您似乎不是骆驼套管,仅在空格上。这是故意的吗?我从未见过没有转换过蛇形(下划线)的驼峰式例程。