2011-01-19 2 views
0

I는 다음과 같습니다 서명과 같은 방법이 있습니다정규 표현식을 사용하여 문자열과 같은 메소드의 매개 변수를 추출하는 방법은 무엇입니까?

void methodName(str arg1, int arg2, int arg3 = 4) 
{ 
} 

또는

내가 여기

(str arg1, int arg2, int arg3 = 4) 
(int arg1) 

을주는이의 매개 변수를 추출 할

str methodName2(int arg1) 
{ 
} 

무엇을한다 I 시도했었다. 이것은 나를 위해 결코 일치하지 않는다.

string namePortion = String.Format(@"^.*{0}", "methodName"); 

Regex rex = new Regex(namePortion + @"\s*(?<params>\(.*\)).*\{", RegexOptions.Compiled | RegexOptions.Multiline); 
string parms = ""; 

Match m = rex.Match(sourceCode); 

if (m.Success) 
{ 
    parms = m.Groups["params"].Value; 
} 

는 또한 RegexBuddy이를 테스트 한, 작동하는 것 같다, 그래서 어떤 문제가 있는지 모르겠습니다.

답변

0

을 만일 Singleline에 여러 줄을 변경할 수있는 당신을 위해 다음과 같은 작업을해야합니다 :

(?:^|[\r\n])[\w\s]*(?<params>\(.*?\)) 

단지 (구분 기호로 사용 중괄호) 프로토 타입을 잡아 :

(?:^|[\r\n])[\w\s]*(?<params>\(.*?\)).*?\{ 

좀 더 구체적인 것을 찾고 계시다면 알려주십시오.

EDIT(?:^|[\r\n])이 파일 또는 라인의 시작 부분에 있는지 확인합니다.

+0

중괄호 하나에서 params 그룹 안의 ungreedy'?'를 제거하십시오. 이렇게하면 괄호 - 즉각적인 중괄호와 일치 시키며 아무 것도 남겨 두지 않습니다. (비록 그것이 [나를 위해 일하는 것 같다] (http://regexr.com?2su3h)) –

0

시도는 매우 광범위한려고하는 경우에

+0

메소드 선언, esp. 많은 매개 변수를 가진 사람들은 여러 줄을 할 수 있고 종종 할 수 있습니다. –

0

이 정규식은 각 매개 변수를 개별적으로 구문 분석하지만 지금은 테스트 할 수 없으므로 책임지고 사용하십시오. Regex 개체에 전역 플래그를 추가해야 하나 이상의 매개 변수와 해당 매개 변수가 한 줄 정규식과 일치하므로 원본의 각 개별 줄과 일치해야합니다.

String regex = "^[\s]*methodName[\s]*\\((?<param>[^,\\)]*)*\\).*?$";

이 정규식 읽기 : 줄의 시작 부분에 (^)는 공간의 수 ([\s]*), 다음 문자열 리터럴 "methodName로"(methodName), 다시 공간의 다음 숫자 ([\s]* 일치), 여는 괄호 (\\()를 입력 한 다음 "param"((?<param>) 캡처 그룹을 시작한 다음 쉼표 또는 닫는 괄호 ([^,\\)]*)가 아닌 수만큼 일치시킨 다음 "param"캡처를 닫습니다 그 그룹을 몇 번이나 그룹으로 묶고 ()*), 마침내 닫힌 괄호, 모든 문자 (게으른) 및 줄의 끝 ()을 찾습니다.)

관련 문제