2016-02-11 2 views
0

Итак, я пытаюсь найти функции (среди y и z), которая содержит вызов функции a с использованием поиска Eclipse.Regex - функция соответствия, которая вызывает другую

В этом коде:

void y() 
{ 
    if {  
    } 
    if { 
    } 
} 

void z() 
{ 
    if { 
    } 
    a(b(c,d,e)); 
    if { 
    } 
} 

Мой Regex совпадает полноту функций y и z исключая перед именем функции.

\b(y|z) ?\(.+?(\r\n|\r|\n)(?s)\{(\r\n|\r|\n).*?((?<=\r\n|\r|\n)\}) 

То, что я хочу, это регулярное выражение, которое соответствует только функции, которые вызывают функцию a внутри него.

Я попытался это, но он не:

\b(y|z) ?\(.+?(\r\n|\r|\n)(?s)\{(\r\n|\r|\n).*(\ba\().+?((?<=\r\n|\r|\n)\}) 
+1

Чтобы сделать предложение, будет ли что-нибудь неправильно с использованием Eclipse, встроенный в способности найти _usages_ из 'а()'? Если вы получите только несколько (скажем, <100) результатов, вы можете выбрать случаи, когда родительская функция будет 'y()' или 'z()'. –

+0

Я очень надеюсь, что смогу найти решение этой проблемы как отдельную проблему. – Kevin

ответ

0

я мог бы добиться этого с помощью регулярных выражений, и перебирать объект генератора в питоне. Может быть, регулярное выражение - единственное, что вам нужно, однако я размещаю здесь весь код.

import re 

mystr = ''' 
void y() 
{ 
    if { 
    } 
    if { 
    } 
} 

void z() 
{ 
    if { 
    } 
    a(b(c,d,e)); 
    if { 
    } 
} 

void y() 
{ 
    if { 
    } 
    a("hello"); 
    if { 
    } 
}''' 

#I've assumed that the return types of both the functions as 'void'. If it is not the case, you've to add few more cases along with 'void' in the regex for other return types 

#This is what you need 
match = re.finditer(r'void\s*(y|z)\s*\(\s?\)\s*\{[^yz]*a((?!void).|\n|\r|\t)*', mystr) 

for x in match: 
    print(x.group()) 

Выход у меня есть:

void z() 
{ 
    if { 
    } 
    a(b(c,d,e)); 
    if { 
    } 
} 

void y() 
{ 
    if { 
    } 
    a("hello"); 
    if { 
    } 
} 
Смежные вопросы