regexp替换为javascript中的函数错误结果

时间:2016-07-09 07:21:31

标签: javascript

见下面的代码:

'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

4 个答案:

答案 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)

&#13;
&#13;
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;
&#13;
&#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'));