4

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

我想使用 RegEx从这个字符串中获取部分method, arg1, arg2, 。arg3

以下正则表达式/([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方法只返回method,arg3部分。

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 等)是任意的,并且可以在不同的情况下改变。

4

3 回答 3

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);
}

演示

顺便说一句,这能够匹配多个方法的出现,例如:

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

如果这不是必需的,您可以锚定表达式:

/^([^<]+)<([^>]*)>$/;
于 2013-05-15T14:36:51.993 回答
1

试试这个正则表达式

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

在此处输入图像描述

捕获的组:

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

任意数量的参数

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

在此处输入图像描述

捕获的组:

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

然后我只需在已知分隔符上拆分组 2,

于 2013-05-15T14:25:29.453 回答
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)
于 2013-05-15T14:44:57.243 回答