在JavaScript中从字符串中提取值

在JavaScript中从字符串中提取值,javascript,string,Javascript,String,给定一个(a,{b:c,d:e,f:g},h})形式的字符串,我想从该字符串中提取a,c,e,g,h。 i、 e.字符串将始终包含3个参数,其中第2个参数的形式为{b:c,d:e,f:g},即它包含键值对,并且可以有任意数量的键值对。我想提取保留在键后面的所有值 我还想提取上述字符串中的第一个和第三个参数,即a和h。 我试图扫描字符串并逐个字符提取,但无法从第二个参数提取值 有什么有效的方法可以使用正则表达式吗?试试这个正则表达式: \(([a-zA-Z0-9_\-]+),\{([a-zA-Z0

给定一个
(a,{b:c,d:e,f:g},h})形式的字符串
,我想从该字符串中提取
a,c,e,g,h
。 i、 e.字符串将始终包含3个参数,其中第2个参数的形式为
{b:c,d:e,f:g}
,即它包含键值对,并且可以有任意数量的键值对。我想提取保留在键后面的所有值

我还想提取上述字符串中的第一个和第三个参数,即
a
h
。 我试图扫描字符串并逐个字符提取,但无法从第二个参数提取值

有什么有效的方法可以使用正则表达式吗?

试试这个正则表达式:

\(([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"]

下面是一个使用多功能的
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;
var str=“(a,{b:c,d:e,f:g},h)”
var-outsr=“”;
var parts=str.split(“,”);
对于(变量ixPart=0;ixPart0)超出+=“,”;
var零件=零件[ixPart];
if(part.indexOf(“:”)大于0){
var parts2=parts[ixPart]。拆分(“:”;
var part2=parts2[1];
if(part2.indexOf(“}”)>=0
outtr+=part2.substring(0,part2.indexOf(“}”);
else EXTR+=第2部分;
}否则{
if(part.indexOf(“(”==0)超出r+=part.substring(1);
如果(part.indexOf(“)”)大于等于0,则为else
outstr+=部分子字符串(0,部分索引(“)”);
else EXTR+=零件;
}
}
回报率;
那么:

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

var parameterArray = testString.split(/\((.+?),\{.+?:(.+?),.+?:(.+?),.+?:(.+?)\},(.+?)\)/);
这假设示例字符串末尾的
}
是o型,但如果不是,则很容易修改。

分而治之

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];
  });
}
这假设数据字符串永远不会:

  • 空白
  • 包含,个字符
  • 从(或)开始{
  • 以)或}结尾

  • 如果字符串的格式如您所述,我将首先编辑字符串,使其成为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
    }
    

    为什么有那根绳子?它是故意畸形的吗?你能对格式做些什么吗?@JosephDreamer是的,它是故意按上述格式存储的。很抱歉,没有让问题更清楚。a、 b、c、d、e、f、g、h本身都是一些字符串。顺便说一句,我假设final}就在final之前)是一个拼写错误。也就是说,在“h”之后的}。如果它不是打字错误,那么我的代码需要进一步修改……我很确定它不会比正则表达式处理更快。但是写它很有趣。