见下面的代码:
'fontSize'.replace(/(.?)([A-Z])/g, function (m, p, z) {
return p == '\\' ? z : p + '-' + z.toLowerCase()
})
它用-s
替换S,但对于输入fontSBCize
,结果将为font-sB-cize
,偶数上限字母始终不会更改。
这里有什么问题?解决这个问题的任何方法?
简而言之,结果测试用例:
测试通过:fontSBCize
=> font-s-b-cize
测试通过:font\\S\\B\\Cize
=> fontSBCize
测试通过:font\\SBCize
=> fontS-b-cize
答案 0 :(得分:0)
如果你想将camelCase转换成snake-case使用它(它支持转义字符):
str.replace(/\\?([A-Z])/g, function($0, $1) {
return $1 === $0 ? "-"+$1.toLowerCase() : $1;
});
<强>演示:强>
console.log('font\\SBCsize'.replace(/\\?([A-Z])/g, function($0, $1) {
return $1 === $0 ? "-"+$1.toLowerCase() : $1;
}))
console.log('font\\S\\B\\Csize'.replace(/\\?([A-Z])/g, function($0, $1) {
return $1 === $0 ? "-"+$1.toLowerCase() : $1;
}))
console.log('fontSBCsize'.replace(/\\?([A-Z])/g, function($0, $1) {
return $1 === $0 ? "-"+$1.toLowerCase() : $1;
}))
答案 1 :(得分:0)
您需要考虑转义字符(检查其字符代码是92)
function replacer(input) {
return input.replace(/[\\]*[A-Z]/g, function(m) {
return m.charCodeAt() != 92 ? "-" + m.toLowerCase() : m.substring(1);
});
}
console.log( replacer( "fontSBCize" ) );
console.log( replacer( "font\\S\\B\\Cize" ) );
console.log( replacer( "font\\SBCize" ) );
&#13;
答案 2 :(得分:0)
哦,我发现下面的解决方案可以通过测试用例:
'fontSDCize'.replace(/(.?)([A-Z])/g, function (m, p, z) {
return p == '\\'
? z
: (/[A-Z]/.test(p) ? '-'+p.toLowerCase() : p) + '-' + z.toLowerCase()
})
也许还有更好的方法吗?欢迎改进!
答案 3 :(得分:0)
您可以拆分字符串并处理每个字符。
function replace(s) {
return s.split('').map(function (a, i, aa) {
return a === '\\' ?
'' :
aa[i - 1] === '\\' || a === a.toLowerCase() ?
a :
'-' + a.toLowerCase();
}).join('');
}
console.log(replace('fontSize'));
console.log(replace('fontSBCize'));
console.log(replace('font\\S\\B\\Cize'));
console.log(replace('font\\SBCize'));