2014-03-31 4 views
1

Я пытаюсь ввести строку ввода, которая выглядит как array[digit or expression or array, digit or expression or array] Так что мне нужно получить значения в [ , ]. Я пытался получить их с помощью этого регулярного выражения:Regex для синтаксического анализа сложного массива

(array1)\[(.*)\,(.*)\] 

получить значения (.*) захвата групп, но doen't работы, потому что жадный квантор, так и в случае:

array1[ array2[4,3] , array2[1,6] ] 

Я получу array2[4,3] , array2[1, в качестве первой группы захвата и 6 в качестве второй, которая является неправильной.

Как я могу получить array2[4,3] в качестве первого и array2[1,6] в качестве второй группы захвата? Или array2[array3[1,1],3] и 5+3, если входная строка array1[ array2[array3[1,1],3] , 5+3 ]?

ответ

3

Вы можете использовать балансирующие группы:

array\d*\[\s*((?:[^\[\]]|(?<o>\[)|(?<-o>\]))+(?(o)(?!))),\s*((?:[^\[\]]|(?<o>\[)|(?<-o>\]))+(?(o)(?!)))\] 

ideone demo на последнюю строку.

Разбивка:

array\d*\[\s* # Match array with its number (if any), first '[' and any spaces 
(
    (?:     
    [^\[\]]  # Match all non-brackets 
    | 
    (?<o>\[)  # Match '[', and capture into 'o' (stands for open) 
    | 
    (?<-o>\]) # Match ']', and delete the 'o' capture 
)+ 
    (?(o)(?!))  # Fails if 'o' doesn't exist 
) 
,\s*    # Match comma and any spaces 
(    # Repeat what was above... 
    (?:    
    [^\[\]]  # Match all non-brackets 
    | 
    (?<o>\[)  # Match '[', and capture into 'o' (stands for open) 
    | 
    (?<-o>\]) # Match ']', and delete the 'o' capture 
)+ 
    (?(o)(?!))  # Fails if 'o' doesn't exist 
) 
\]    # Last closing brace 
+0

Это терпит неудачу, если добавить третий массив. – rbrundritt

+0

@rbrundritt В этом вопросе есть только один массив с (не более) 2-ю вспомогательными массивами (но которые могут иметь больше подматриц). Я не уверен, что вы имеете в виду...? – Jerry

+0

Не имело бы смысла позволить ему работать с любым количеством вспомогательных массивов. – rbrundritt

Смежные вопросы