정규표현식 질문입니다 (javascript 함수 이름만 잡아내기)

라스코니의 이미지

정규표현식을 여쭤볼려고 합니다. 좀 어렵네요.
아래와 같은 코드(자바스크립트 코드)가 있다고 했을 때 함수명만 잡아내고 싶습니다.

var t1 = 10;
 
function test1 (var x)
{
}
 
function test2()
{
}
 
test1();

위와 같은 코드라면 test1, test2 만 잡아내고 싶습니다. 이렇게 잡아 낼수 있는 정규표현식을 좀 알려 주세요.

감사합니다 ^^

qiiiiiiiip의 이미지

GNU grep의 경우에

$ grep -o -P "^\s*function\s+\S+(?=\s*\([^)]*)" your_script.java | sed "s,\s*function\s*,,"

또는 일반 grep의 경우라도,

$ grep "^\s*function\s" your_script.java | sed -e "s,\(\s*function\s\+\)\(\S\+\)\(\s*([^)]*)\),\2,"

grep과 sed를 합쳐서 더 간단히 될 것 같은데요...

라스코니의 이미지

grep과 sed 를 쓰지 않고 해야 합니다. 가능할까요?

pogusm의 이미지

# grep '[a-zA-Z]\w*\s*(' test.js

라스코니의 이미지

패턴은 아래와 같고

(?!function\s+)([_$a-zA-Z][_$a-zA-Z0-9]*)(?=\s*\()

테스트하고 있는 js 코드는 아래와 같습니다.

// TEST.Nooo()
 
function test ()
{
}
 
function test1()
{
}
 
function test2     ()
{
    Nooo1();
    Nooo2  ();
}

http://myregexp.com/signedJar.html 에 넣고 바로 바로 체크하면서 보고 있는데 깔끔하게 안되네요.
Nooo 등은 검출되면 안되는데 되고 있어요. 도움 주세요.

pogusm의 이미지

([a-zA-Z]\w*)(?=\s*\()

라스코니의 이미지

넣어봤는데 똑같이 Nooo 등도 선택되는 것으로 나타나네요.

pogusm의 이미지

저렇게 찾는건 잘 모르겠네용 ㅋ

그냥
function\s+([a-zA-Z]\w*)\s*\( 이렇게 찾은다음에
괄호에 매칭되는걸 변수($1)로 뽑아서 사용하는 방법은 어떤가요?

라스코니의 이미지

http://myregexp.com/signedJar.html 에 넣어 봤는데 아무것도 선택되지 않는군요.

qiiiiiiiip의 이미지

?!는 negative lookback 아닌가요? ?! 대신 ?<= 을 써야할듯.. (엔진마다 다를 수도..)
lookback에서 *등을 쓸수가 없으니 \s+를 빼고해보시고..

라스코니의 이미지

해봤는데 아무것도 선택되지 않네요

qiiiiiiiip의 이미지

\s+를 뺀다는 의미는 괄호밖으로 뺀다는 뜻입니다.. 혹시나..

라스코니의 이미지

아, 그렇군요. 해보니 되는데
test1 앞의 공백까지 모두 선택이 됩니다.
이 공백을 제거할 수 있을까요? 감사합니다.

pogusm의 이미지

<script type="text/javascript">
var re = /function\s+([a-zA-Z]\w*)\s*\(/g;
var str = "TEST.Nooo()\nfunction test ()\n{\n}\nfunction test1()\n{\n}\nfunction test2     ()\n{\n    Nooo1();\n    Nooo2  ();\n}";
var resultArray = re.exec(str);
while (resultArray) {
    document.writeln(resultArray[1] + " ");
    resultArray = re.exec(str);
}
</script>

결과 : test test1 test2

원하시는건 아니지만 참고하시라고...

라스코니의 이미지

결과는 딱 제가 원하는 것 같은데 javascript 내에서만 가능한거죠?