[英]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.