我正试图用javascript解析这样的字符串:
var mystr = "param1('stringValue'), param2(IntegerValue IntegerValue)";
最后我需要获取每个参数名称(param1和param2)和值(一个字符串值或两个整数值)。
但是,原始字符串可以包含任意数量的参数,例如:
"param1('stringValue')"
"param1('stringValue'), param2(IntegerValue IntegerValue), param2(IntegerValue IntegerValue)"
要求:
答案 0 :(得分:2)
var str = "param1('stringValue'), param2(1 2), param2(34 555)";
var re = /(\w+)\((?:'([^']+)'|(\d+) (\d+))\)/g;
var a = [], match, value;
while(match = re.exec(str)) {
if (match[2] != null) value = match[2];
else value = [parseInt(match[3]), parseInt(match[4])];
a.push([match[1], value]);
}
a; // [["param1", "stringValue"], ["param2", [1, 2]], ["param2", [34, 555]]]
字符串中不应包含'
个符号。如果你想要完全万无一失的解决方案,你需要放弃正则表达式并使用一些解析器。
使用类似[^']|(<?\\(?:\\\\)*)'
的内容解析转义字符串是可能的,但js中的正则表达式不支持后视图,并且根本不支持AFAIR可变长度的后视图。
答案 1 :(得分:1)
function parse( str ) {
var rparse = /([a-zA-Z0-9$_]+)\(|'([^']*)'|(\d+ \d+)/g,
cur, r = [];
while( ( cur = rparse.exec( str ) ) ) {
if( cur[1] ) {
r.push( {name: cur[1] } );
}
else if( cur[2] ) {
r[r.length-1].values = [cur[2]];
}
else if( cur[3] ) {
r[r.length-1].values = cur[3].split(" ").map( Number );
}
}
return r;
}