给定一个形式的字符串"(a,{b:c,d:e,f:g},h})"
,我想a,c,e,g,h
从字符串中提取。即字符串将始终包含 3 个参数,其中第二个参数的形式为{b:c,d:e,f:g}
ie,它包含键值对,并且可以有任意数量的键值对。我想提取所有留下键的值。
另外我想提取第一个和第三个参数,即a
在h
上面的字符串中。我正在尝试扫描字符串并逐个字符地提取字符,但我无法从第二个参数中提取值。
是否有任何有效的方法可以使用正则表达式?
给定一个形式的字符串"(a,{b:c,d:e,f:g},h})"
,我想a,c,e,g,h
从字符串中提取。即字符串将始终包含 3 个参数,其中第二个参数的形式为{b:c,d:e,f:g}
ie,它包含键值对,并且可以有任意数量的键值对。我想提取所有留下键的值。
另外我想提取第一个和第三个参数,即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 testString = "(a,{b:c,d:e,f:g},h)";
var parameterArray = testString.split(/\((.+?),\{.+?:(.+?),.+?:(.+?),.+?:(.+?)\},(.+?)\)/);
这假设})
示例字符串末尾的 是类型-o,但如果不是,则很容易修改。
如果字符串的格式如您所描述的那样已知,我将首先编辑字符串以将其转换为 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
}
分而治之!
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];
});
}
这假设数据字符串永远不会: