在JavaScript中从字符串中提取值

时间:2012-05-26 07:56:09

标签: javascript string

给定"(a,{b:c,d:e,f:g},h})"形式的字符串,我想从字符串中提取a,c,e,g,h。 即字符串将始终包含3个参数,其中第二个参数的格式为{b:c,d:e,f:g},即它包含键值对,并且可以有任意数量的值。我想提取留下密钥的所有值。

此外,我想在上面的字符串中提取第一个和第三个参数,即ah。 我正在尝试扫描字符串并按字符基础提取字符,但我无法从第二个参数中提取值。

有没有有效的方法可以使用正则表达式?

5 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

\(([a-zA-Z0-9_\-]+),\{([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+)\},([a-zA-Z0-9_\-]+)\}\)

第一组是a,第二组是b,等等:

> str.match(/\(([a-zA-Z0-9_\-]+),\{([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+)\},([a-zA-Z0-9_\-]+)\}\)/)
["(a,{b:c,d:e,f:g},h})", "a", "b", "c", "d", "e", "f", "g", "h"]

答案 1 :(得分:0)

这是一个使用多功能split功能的复杂解决方案:

var str = "(a,{b:c,d:e,f:g},h)"
var outstr = "";

var parts = str.split(",");
for (var ixPart = 0; ixPart < parts.length; ++ixPart) {
    if (ixPart > 0) outstr += ",";
    var part = parts[ixPart];
    if (part.indexOf(":") > 0) {
        var parts2 = parts[ixPart].split(":");
        var part2 = parts2[1];
        if (part2.indexOf("}") >= 0)
           outstr += part2.substring(0, part2.indexOf("}"));
        else outstr += part2;
    } else {
       if (part.indexOf("(") == 0) outstr += part.substring(1);
       else if (part.indexOf(")") >= 0)
           outstr += part.substring(0, part.indexOf(")"));
       else outstr += part;
    }
}

return outstr;

答案 2 :(得分:0)

怎么样:

var testString = "(a,{b:c,d:e,f:g},h)";

var parameterArray = testString.split(/\((.+?),\{.+?:(.+?),.+?:(.+?),.+?:(.+?)\},(.+?)\)/);

这假设示例字符串末尾的})是一个类型-o,但如果不是,则很容易修改。

答案 3 :(得分:0)

分而治之!

function extract (str) {
  str = str.trim ().split (/\s*,\s*/); // split on , chars with optional surrounding spaces
  return str.map (function (v) { // create array from values
    // remove prefix and/or suffix from required values :
    // first ignore any leading ( or { chars
    // then ignore a single word followed by :
    // use the following trimmed string as the data
    // ignore any ) or } at the end  
    return (v.match (/^[({]*(?:\w\s*:\s*)?\s*(.*?)\s*[)}]*$/) || ['', v]) [1];
  });
}

这假设数据字符串永远不会:

  1. 是空白
  2. 包含,字符
  3. 以(或{
  4. 开头)开头
  5. 以...结束)或}}

答案 4 :(得分:0)

如果字符串的格式如您所述,我会先编辑字符串以使其成为JSON,然后使用eval

示例:

var str1 = "('word1',{b:'word2',d:'word3',f:'word4'},'word5')";

// Edit the string to JSON format by replacing '(' and ')' with '[' and ']'
var str2 = str1.replace(/\(/, '[').replace(/\)/, ']')

// str2 is now => "['word1',{b:'word2',d:'word3',f:'word4'},'word5']"

var obj = eval(str2);

// All you results are now in obj.

var result1 = obj[0]; // This gets'word1'

//Similarly you can get the rest as follows:
obj[1].b // This gives you 'word2'
obj[1].d // 'word3'
obj[1].f // 'word4'
obj[2]   // 'word5'

如果obj[1]具有可变数量的键/值对,并且您只想要值,则可以按如下方式迭代对象obj[1]

for (var key in obj[1]) {
  obj[1][key];  // This gives the values in each iteration
}