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

How to form a javascript regex for an undetermined length of parameters

本文关键字:参数 javascript 正则表达式 不确定      更新时间:2023-09-26

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

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

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

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

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

要求:

  1. 每个参数之间有一个逗号,值在括号内
  2. 括号内可以是一个字符串值,也可以是两个中间有空格的整数
  3. 可以有任意数量的参数(但至少有1个)
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]]]

字符串中不应包含'符号。如果您想要完全万无一失的解决方案,您需要放弃regexs并使用一些解析器。

使用[^']|(<?''(?:'''')*)'之类的东西可以解析转义字符串,但js中的正则表达式不支持look-behinds,并且根本不支持AFAIR可变长度look-behinds。

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/