2013-05-15 52 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>" 

如果這是沒有必要的,你可以錨表達:

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