我写了一个简单的函数来替换一些字符串。
规则:
dot
必须由" _attributes替换。" ; [numbers]
必须由.numbers
替换; (numbers
表示1,123 ......等等)实际上我写了这样的替换:
str.replace(/(\[?\d*\]?\.)/g, '_attributes$1')
.replace(/\[(\d+)\]/g, '.$1');
输入示例:
model.city
model[0].city
model0.city
model[0].another_model[4].city
预期输出:
model_attributes.city
model_attributes.0.city
model0_attributes.city
model_attributes.0.another_model_attributes.4.city
它已经差不多完成了,除了它在dot
之前有一个数字(没有括号)的情况下失败了:
model0.city
打印:
model_attributes0.city
虽然我希望它是:
model0_attributes.city
下面是一个简单的片段,您可以看到我想要实现的目标:
var fields = [
'model.city',
'model[0].city',
'model0.city',
'model[0].another_model[4].city',
'model[0].another_model4.city'
];
var expectedArr = [
'model_attributes.city',
'model_attributes.0.city',
'model0_attributes.city',
'model_attributes.0.another_model_attributes.4.city',
'model_attributes.0.another_model4_attributes.city'
];
var replacedArr = [];
for (const field of fields) {
var replaced = field.replace(/(\[?\d*\]?\.)/g, '_attributes$1').replace(/\[(\d+)\]/g, '.$1');
replacedArr.push(replaced);
}
console.log('expected => ', expectedArr);
console.log('actual => ', replacedArr);

我需要更换function
才能使其正常工作? TIA。
答案 0 :(得分:1)
这应该是你要找的东西:
x
var fields = [
'model.city',
'model[0].city',
'model0.city',
'model[0].another_model[4].city',
'model[0].another_model4.city'
];
var expectedArr = [
'model_attributes.city',
'model_attributes.0.city',
'model0_attributes.city',
'model_attributes.0.another_model_attributes.4.city',
'model_attributes.0.another_model4_attributes.city'
];
var replacedArr = [];
for (const field of fields) {
var replaced = field.replace(/(\[\d+\])?\./g, '_attributes$1.').replace(/\[(\d+)\]/g, '.$1');
replacedArr.push(replaced);
}
console.log('expected => ', expectedArr);
console.log('actual => ', replacedArr);
答案 1 :(得分:1)
在第一个正则表达式中,只需将群集组设为可选,就像这样
str.replace(/((?:\[\d+\])?\.)/g, '_attributes$1')
你很高兴。
扩展
( # (1 start)
(?: \[ \d+ \] )? # Optional '[ddd]' group
\. # Required dot
) # (1 end)
JS样本
function PrintMod( str )
{
console.log( str.replace(/((?:\[\d+\])?\.)/g, '_attributes$1')
.replace(/\[(\d+)\]/g, '.$1') );
}
PrintMod( 'model.city' );
PrintMod( 'model[0].city' );
PrintMod( 'model0.city' );
PrintMod( 'model[0].another_model[4].city' );
PrintMod( 'model[0].another_model4.city' );