如何为未确定长度的参数形成javascript正则表达式

时间:2012-03-29 18:41:49

标签: javascript regex

我正试图用javascript解析这样的字符串:

var mystr = "param1('stringValue'), param2(IntegerValue IntegerValue)";

最后我需要获取每个参数名称(param1和param2)和值(一个字符串值或两个整数值)。

但是,原始字符串可以包含任意数量的参数,例如:

"param1('stringValue')"

"param1('stringValue'), param2(IntegerValue IntegerValue), param2(IntegerValue IntegerValue)"

要求:

  1. 每个参数之间是逗号,值在括号内。
  2. 在括号内可以是一个字符串值,也可以是两个整数,其间有空格。
  3. 可以有任意数量的参数(但至少为1个)

2 个答案:

答案 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;

}

http://jsfiddle.net/xmajs/