2015-01-27 2 views
1

Regex를 사용하여 함수 호출을 일치 시키려고하지만 동일한 함수의 중첩 호출이 들어있는 큰 JS 파일을 제공하지 않습니다. 예를 들어 JS 파일의 코드는 다음과 같습니다.JS Regex 함수 호출과 일치

abc('hello', function(){ 
    abc('hello1', function(){ 
     abc('hello2', function() { 
      // Does some! 
     }); 
    }); 
}); 

첫 번째 매개 변수를 식별하기 위해 첫 번째 호출 만 일치 시키려고합니다. 최종 결과는 hello입니다. 먼저 전화를 걸 때 다음과 같이하십시오.

.replace(/(?:\r\n|\r|\n)/g, '').match(/abc\s*[^\"\']*\"([^\"\']*)\"/); 

어떤 제안을 해주시겠습니까?

+1

왜 투표가 내려 집니까? 미스터 Downvoter 당신 downvote에 대한 설명을 주려고 자신을 행동 주시겠습니까? – redV

+8

나는 downvote하지 않았지만, 일반적으로 이런 종류의 작업을 위해 regexes를 사용하는 것은 나쁜 생각으로 간주됩니다. 특히 입력 데이터의 중첩/재귀 특성 때문입니다. 자바 스크립트를 거대한 문자열이 아닌 자바 스크립트로 해석하는 라이브러리를 찾고 더 나아가 자신이해야 할 일을 해보는 것이 좋습니다. – funkwurm

답변

9

Esprima와 같은 JS 파서를 사용하면됩니다. 이것은 내 생각에 마술 정규식보다는 정확하고 신뢰할 수있는 솔루션이 될 것입니다. 정규 표현식은 종종 유지하기가 어렵고 엣지 경우에 종종 실패합니다. 그것들은 어떤 경우에는 매우 유용하지만 이것도 그 중 하나가 아닙니다.

Esprima Demo

입력 :

abc('hello', function(){ 
    abc('hello1', function(){ 
     abc('hello2', function() { 
      /* ... */ 
     }); 
    }); 
}); 

abc('hello3', function(){ 
    abc('hello4', function(){ 
     abc('hello5', function() { 
      /* ... */ 
     }); 
    }); 
}); 

그런 다음 첫 번째 "수준"기능을 찾기 위해 반환 된 JSON을 필터링하고 자신의 첫 번째 인수

사용이 도구를 Esprima을 시도하려면 :

JSON.body.filter(function(token) { 
    return token.type === 'ExpressionStatement' && token.expression.type === 
     'CallExpression' && token.expression.callee.name === "abc" 
}).map(function(funcToken) { 
    return funcToken.expression.arguments[0].value 
}) 

다음 예는 사례 :

["hello", "hello3"]