使用替换javascript

时间:2017-06-12 00:44:54

标签: javascript regex

我写了一个简单的函数来替换一些字符串。

规则:

  • 每个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。

2 个答案:

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