在RegEx中获取组的多个匹配项

时间:2013-05-15 14:21:11

标签: javascript regex

考虑以下字符串method<arg1,arg2,arg3>

我想使用RegEx从此字符串中获取methodarg1arg2arg3部分。

以下正则表达式/([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i将字符串作为整体匹配。

即,

var result = /([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i.test('method<arg1,arg2,arg3>');
// result = true

但是,regEx.exec方法仅返回methodarg3部分。

result = /([a-z0-9]+)<(?:([a-z0-9]+),?)*>/i.exec('method<arg1,arg2,arg3>');

// result is ["methodname<arg1,arg2,arg3>", "methodname", "arg3"]

// as opposed to 
// ["methodname<arg1,arg2,arg3>", "methodname", "arg1", "arg2", "arg3"]

有没有办法获得小组的所有比赛?

注意:我问这是为了学习,我不想让JavaScript解决。

编辑: args的数量(arg1,arg2等)是任意的,在不同情况下可能会发生变化。

3 个答案:

答案 0 :(得分:2)

你需要把它分成两个表达式,一个用于外部字符串,一个用于内部;但是,内部表达式可以简化为常规字符串拆分。

var str = 'method<arg1,arg2,arg3>',
outer_re = /(\w+)<([^>]*)>/g;

while ((match = outer_re.exec(str)) !== null) {
    var fn = match[1],
    args = match[2].split(',');

    console.log(fn, args);
}

Demo

顺便说一句,这可以匹配多个方法出现,例如:

"method1<arg1> method2<arg1,arg2>"

如果没有必要,您可以锚定表达式:

/^([^<]+)<([^>]*)>$/;

答案 1 :(得分:1)

试试这个正则表达式

\b([^<]*)<([^,]*),([^,]*),([^>]*)>

enter image description here

被捕获的团体:

0: "method<arg1,arg2,arg3>"
1: "method"
2: "arg1"
3: "arg2"
4: "arg3"

任意数量的参数

\b([^<]*)<([^>]*)>提取出名称和所有参数。

enter image description here

被捕获的团体:

0: "method<arg1,arg2,arg3>"
1: "method"
2: "arg1,arg2,arg3"

然后我只是将组2拆分为已知分隔符,

答案 2 :(得分:0)

以下内容可行:

input = "method<arg1,arg2,arg3>";
action = input.match (/^(\w*)\s*<\s*(.*)?\s*>$/);
action[2] = action[2].split (/\s*,\s*/); // array of args

;; processing method action[1] and arguments action[2] (an array)
相关问题