繁体   English   中英

正则表达式用函数替换在JavaScript中导致错误

[英]regexp replace with function wrong result in javascript

请参阅以下代码:

'fontSize'.replace(/(.?)([A-Z])/g, function (m, p, z) {
    return p == '\\' ? z : p + '-' + z.toLowerCase()
})

它用-s代替S,但是对于输入fontSBCize ,结果将是font-sB-cize ,偶数大写字母始终不会改变。

怎么了 这个问题有解决方案吗?

简而言之,结果测试用例:

通过测试: fontSBCize => font-sb-cize

通过测试: font\\\\S\\\\B\\\\Cize => fontSBCize

通过测试: font\\\\SBCize => fontS-b-cize

如果要将骆驼箱转换为蛇形箱,请使用以下命令(它支持转义字符):

str.replace(/\\?([A-Z])/g, function($0, $1) {
    return $1 === $0 ? "-"+$1.toLowerCase() : $1;
});

演示:

 console.log('font\\\\SBCsize'.replace(/\\\\?([AZ])/g, function($0, $1) { return $1 === $0 ? "-"+$1.toLowerCase() : $1; })) console.log('font\\\\S\\\\B\\\\Csize'.replace(/\\\\?([AZ])/g, function($0, $1) { return $1 === $0 ? "-"+$1.toLowerCase() : $1; })) console.log('fontSBCsize'.replace(/\\\\?([AZ])/g, function($0, $1) { return $1 === $0 ? "-"+$1.toLowerCase() : $1; })) 

您需要考虑转义字符(检查其字符代码为92)

 function replacer(input) { return input.replace(/[\\\\]*[AZ]/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" ) ); 

哦,我发现下面的解决方案可以通过测试用例:

'fontSDCize'.replace(/(.?)([A-Z])/g, function (m, p, z) {
    return p == '\\' 
    ? z 
    : (/[A-Z]/.test(p) ? '-'+p.toLowerCase() : p) + '-' + z.toLowerCase()
})

也许有更好的办法? 改进欢迎!

您可以分割字符串并处理每个字符。

 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')); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM