2015-03-23 3 views
0

Мне нужно разобрать файл, который включает вызовы функций. Например:Разбор параметров Regex

function(otherFunction1(parameters1), otherFunction2(parameters2)) 

Мне нужен выход, чтобы быть:

otherFunction1(parameters1), otherFunction2(parameters2) 

Моя попытка это:

open(my $DATA, '<', 'txt') or die "..."; 
while(my $line = <$DATA>){ 
    $line =~ /\((\w+)\)/; 
    my $parameters = $1; 

    print "$parameters\n"; 
} 

Я просто получаю

parameters1 

Есть способ использовать регулярное выражение, чтобы найти первый и последний появление указанного символа?

Спасибо!

+0

Первый: '/ c /'. Последний '/^.* c/s' – ikegami

ответ

2

Вам понадобится рекурсивное регулярное выражение, чтобы сделать это правильно. Как этот (с флагом x):

(?(DEFINE) 
    (?<fn>     # a function is: 
    \w+ \s*    # a name 
    \((?&paramList) \) # and a parameter list 
) 

    (?<paramList> 
    (?: 
     \s* (?&param) 
     (?: , \s* (?&param))* \s* 
    )* 
) 

    (?<param> # a parameter is: 
    (?&fn) # a function call 
    | \w+  # or a simple value 
) 
) 

\w+ \s* \((?<extractedParameters>(?&paramList)) \) 

Demo.

Это необходимо для соответствия открывающей и закрывающейся скобках. Просто расширьте синтаксис по мере необходимости.

Узор внизу равен эквиваленту (?&fn), за исключением того, что он содержит список параметров в группе захвата.

0

У вас его почти нет. Вы хотите, чтобы все между первой и последней скобками на каждой строке, правильно? Если строки для синтаксического анализа более сложны, чем ваш пример, это небольшое изменение в коде может быть все, что вам нужно.

$line =~ /\((.*)\)/; 
my $parameters = $1; 

Ваш \w+ остановится соответствие с первым символом, не слово в строке. В вашем примере это первая правая скобка.

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