如何在逗号分隔的字符串中插入默认值?

时间:2013-12-19 15:38:13

标签: javascript

我有一组逗号分隔的字符串,如果任何字符串不是数值,我需要插入“(1)”。

"stack(2),flow,over(4),temp(7)"  Here insert default value to flow(1)
"stack(2),flow(3),over(4),temp"  Here insert default value to temp(1)
"stack,flow(3),over,temp"        Here insert default value to stack(1),over(1),temp(1) 

我有验证码验证并在需要时插入默认值。请帮我知道如何在括号内插入默认值。

javascript函数:

var case1 = "stack(2),flow(2),over(4),temp(7)"; // - true
var case2 = "stack(2),flow(3),over(4),temp(k)"; // - false
var case3 = "stack(2),flow(2),over(4),temp(0"; // - false
var case4 = "stack(2),flow(2),over(,temp)"; // - false
var case5 = "stack(2),flow(2),over(4)temp(8)"; // - false
var case6 = "stack(1),flow(7),over,temp"; // - true
var case7 = "stack(1),flow(7),OVER,Temp"; // - true
var case8 = "stack(1),flow(7),over_r,temp_t"; // - true

function testCases(str)
{
    var pattern = /^[a-z]+(?:\(\d+\))?(?:,[a-z]+(?:\(\d+\))?)*$/
    return pattern.test(str);
} 

以上功能适用于jsfiddle

中的验证

4 个答案:

答案 0 :(得分:4)

不幸的是,JavaScript没有外观 - 它们在这里非常有用。相反,我们必须作弊:

str = str.replace(/([^)])(,|$)/g,"$1(1)$2");

这样做可以捕获逗号或字符串结尾之前的任何字符,前提是它不是一个闭括号。然后,它会在该位置插入(1)默认值。

答案 1 :(得分:4)

TL;博士

使用String.prototype.splitString.prototype.join处理字符串的每个部分。

详细信息

如果要对字符串应用自定义修复,则需要将其拆分为多个部分,然后对其进行处理。完成工作后,将所有部件连接在一起。

实施

使用Array.prototype.map警告:与IE 8及以下版本不兼容):
Demo on JSFiddle

function testCases(str) {
  return str.split(',').map(function(s) {
    if (s.match(/^[a-z]+\(\d+\)$/i)) {
      // string is valid
      return s;
    } else {
      // you can do processing here based on the failure reason
      return s + '(1)';
    }
  }).join(',');
}

使用for循环(IE8兼容):

function testCases(str) {
  var parts = str.split(',');
  var i = parts.length;
  while (i--) {
    var s = parts[i];
    if (!s.match(/^[a-z]+\(\d+\)$/i)) {
      // string is invalid
      // you can do processing here based on the failure reason.
      parts[i] = s + '(1)';
    }
  }
  return parts.join(',');
}

答案 2 :(得分:1)

var add_default = function(str, def) {
    str = str.split(',');
    for(var i = 0; i < str.length; ++i) {
        if(!/\(\d+\)$/.test(str[i]))
            str[i] += "(" + def + ")";
    }
    return str.join(',');
};

http://jsfiddle.net/BhVx3/3/

答案 3 :(得分:1)

这是一个可能的解决方案:

function fix(input) {
    var r = /^(.*?)(?:\((\d*)\)?|\)?)$/,
        input = input.split(','),
        output = [],
        item;
    while (item = input.shift()) {
        item = item.match(r);
        item = item[1] + '(' + (item[2] || 1) + ')';
        output.push(item);
    }
    return output.join();   
}
var s = 'stack(2),over(4),flow,hello(0,kitty2)';
s = fix(s); // "stack(2),over(4),flow(1),hello(0),kitty2(1)"