2014-01-07 23 views
1

我想排除其中一個另一個具有RegEx的字符。 我有一個正則表達式,用於搜索模式\[([^\[]+\]\=\>(.*)RegEx排除一個或另一個字符

我的問題是最後的捕獲模式。跟在>之後的字符串應該後面跟一個逗號或右括號。

這是我的文字:Array([0]=>123,[1]=>Array([a]=>1,[b]=>2)),我想:

// match 1 
0 = 0 
1 = 123 

// match 2 
0 = 1 
1 = Array([a]=>1,[b]=>2) 

這是我的正則表達式:\[([^\[]+)\]\=\>([^,\)]+)\)?,但我得到:

// match 1 
0 = 0 
1 = 123 

// match 2 
0 = 1 
1 = Array([a]=>1 

// match 3 
0 = b 
1 = 2 

回答

5

字符類[^,\)]明確排除逗號,因此它永遠不會匹配Array([a]=>1,[b]=>2)

如果你是隻有一個級別嵌套OK,你可以嘗試以下方法: \[([^\]]+)\]=>(Array\([^\)]+\)|[^,\)]+)?

如果你想擁有的Array arbitarily嵌套定義,這個問題不能使用正則表達式來解決,因爲你想解析的語言不是一種常規的語言。您應該使用一個解析器生成或寫一個遞歸下降解析器,實現了以下語法:

Start : Array 
Array : "Array" "(" ElementList ")" 
ElementList : "" | Elements 
Elements : Element | Element "," Elements 
Element : "[" String "]" "=>" Value 
Value : Number | Array 
Number : [1-9][0-9]* 
String : [^\]]+ 

嘗試尋找解析器發電機的JavaScript。 PEG.js是一個例子:http://pegjs.majda.cz/

+0

我很高興與一級嵌套。我實際上想要第二個數組完全作爲字符串。但是,當你嘗試我的解決方案和你的(使用rubular.com),你會看到,他們都導致相同的 –

+0

我修正了正則表達式,嘗試新的。 –

+0

剛剛看到編輯 –

0

正則表達式或句法是管道|例如「a | b」將批量a或b

相關問題