2013-05-15 35 views
4

考虑以下字符串method<arg1,arg2,arg3>获取多个匹配的一组在正则表达式

我想用正则表达式来获得部分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的工作。

编辑:参数的个数(arg1,arg2等)是任意的,可以在不同情况下更改。

+1

这可能会帮助:HTTP://www.regular-expressions .info/captureall.html – techfoobar

+0

'方法'多次出现在字符串中? –

+0

+1,很好,很好的问题 – Senjai

回答

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) 
+0

这是最接近我需要的答案。 @ techfoobar在问题中的评论解释了为什么它不能用单个正则表达式来完成。 – ManojRK

1

试试这个表达式

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

enter image description here

捕获组:

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

任意数量的参数

\b([^<]*)<([^>]*)>翻出的名字和所有变元TS。

enter image description here

捕获组:

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

然后我会简单地拆分组2对已知的分隔符,

+0

虽然这对于3个参数是正确的,但它不是动态的,并且如果参数数量未知,则不会工作。 – techfoobar

+0

我想知道动态数量的参数。 – ManojRK

+0

OP没有指定有多个参数 –

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>" 

如果这是没有必要的,你可以锚表达:

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