2011-04-11 3 views
3

주어진 JavaScript 코드에서 모든 변수 (메서드 만 완전히 무시하고 변수 만 찾습니다)를 찾는 정규 표현식을 작성하려고합니다. 실제 코드 (regex를 실행하는 코드)는 Java로 작성됩니다.변수를 찾고 메서드를 무시하는 정규식

지금, 나는 이런 식으로 뭔가를 가지고 :

Matcher matcher=Pattern.compile(".*?([a-z]+\\w*?).*?").matcher(string); 
while(matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

그래서 때 "문자열"의 값은 variable*func()*20

출력입니다 :

variable 
func 

하지 무엇을하는 내가 원하는. (의 간단한 부정은 정규 표현식이 불필요한 문자를 잡아 내거나 잘라내 버리기 때문에 발생하지 않지만 여전히 함수가 캡처됩니다. 지금, 나는 다음과 같은 코드가 있습니다

그것은 작동
Matcher matcher=Pattern.compile(".*?(([a-z]+\\w*)(\\(?)).*?").matcher(formula); 
while(matcher.find()) { 
    if(matcher.group(3).isEmpty()) { 
     System.out.println(matcher.group(2)); 
    } 
} 

, 인쇄물이 올바른지,하지만 난 추가 검사를 좋아하지 않는다. 어떤 아이디어? 부디?

EDIT (2011-04-12) :

모든 답변에 감사드립니다. 질문이 있는데, 왜 내가 그런 것을 필요로할까요? 그리고 당신이 옳다면, 더 크고 복잡한 스크립트의 경우, 유일한 제정신의 해결책은 그들을 파싱 할 것입니다. 그러나 제 경우에는 과도한 행동입니다. 내가 일하는 JS의 스크랩은 단순한 수식으로 의도되어 있습니다. (a+b)/2과 같습니다. 주석, 문자열 리터럴, 배열 등이 없습니다. 변수와 (아마도) 내장 함수 만 가능합니다. 나는 그들이 초기화 될 수 있는지 그리고이 시점에서 (그리고 전혀 초기화되었는지) 확인하기 위해 변수 목록이 필요하다. RPN으로 모든 작업을 수동으로 수행 할 수 있다는 것을 알고 있습니다. (더 안전 할 것입니다.)하지만이 공식은 더 큰 스크립트로 랩핑되고 웹 브라우저에서 평가되므로이 방법이 더 편리합니다.

이것은 약간 더러울 수 있지만,이 수식을 작성하는 사람 (대부분 나에게 아마도 대부분)은 무엇을하고 있는지를 알고 있고 올바르게 작동하는지 확인할 수 있다고 가정합니다.

누구나 비슷한 질문을하고 싶다면 위험/어려움이 있어야합니다. 적어도, 나는 희망한다.)

+1

정확히는 같지 않지만 다음을보십시오 : http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 정규식은 만병 통치약이 아닙니다! – Serafeim

답변

1

정규 표현식이 직업에 가장 적합한 도구가 아닌 것에 대한 모든 건전한 조언을하는 것이 중요합니다. 그러나 규칙은 간단하다 경우 당신은 신속하고 더러운 정규식 멀리 얻을 수 있습니다 (당신은 그 규칙의 한계를 알고 있습니다) :이 괄호로 오래 준수하지 않을 것 같은 식별자를 일치

Pattern regex = Pattern.compile(
    "\\b  # word boundary\n" + 
    "[A-Za-z]# 1 ASCII letter\n" + 
    "\\w* # 0+ alnums\n" + 
    "\\b  # word boundary\n" + 
    "(?!  # Lookahead assertion: Make sure there is no...\n" + 
    " \\s* # optional whitespace\n" + 
    " \\( # opening parenthesis\n" + 
    ")  # ...at this position in the string", 
    Pattern.COMMENTS); 

. 물론 group(1) 대신 group(0)이 필요합니다. 그리고 물론 이것은 많은 다른 것들 (문자열, 주석 등)과 일치합니다 ...

+0

대단히 감사합니다! 그것은 내가 필요한 것이고, 당신의 대답은 나의 문제를 해결할뿐만 아니라 매우 유익합니다. 나는 조금 더 현명하다고 느낍니다. 그것은 다른 것들을 잡을 것입니다. 그러나 제가 업데이트 된 질문에 언급했듯이, 제 경우에는 용납 될 수 있습니다. – genobis

1

구조화 된 입력을 구문 분석하기 위해 regex를 안정 적으로 사용할 수 없다는 것은 꽤 잘 알려져있다. 유명한 응답 여기를 참조하십시오 : RegEx match open tags except XHTML self-contained tags

문자의 특정 순서 또는 문자의 이전 또는 이후의 순서에 따라 의미를 변경하지 않을 수 있습니다, 당신이 안정적으로 입력 텍스트를 분석 모두 렉싱 없이 구문 요소를 식별 할 수 . 정규 표현식은 전자의 경우 (입력 스트림을 토큰으로 분리) 사용할 수 있지만 후자의 경우에는 안정적으로 사용할 수 없습니다 (스트림의 위치에 따라 토큰에 의미를 할당).

+0

나는 그걸 보지 못했다. 최고의 반응! 네, 당신이 옳다고 생각합니다. 다른 포스터는 일부 파서를 언급했지만 내 경우에는 약간 과도하다고 생각한다. – genobis

1

regex를 사용하여 다시 생각해보고 다른 방법이 궁금하면 AST를 사용하여 프로그래밍 방식으로 소스에 액세스하는 방법을 고려해 볼 수 있습니다. This answer은 Eclipse Java AST를 사용하여 Java 소스에 대한 구문 트리를 빌드 할 수 있음을 보여줍니다. 나는 당신이 Javascript와 비슷하게 할 수 있다고 생각합니다.

+0

나는 조금 봤는데, 나는 정말로, (http://help.eclipse.org/helios/index 수 있음을 알았다. .jsp? topic =/org.eclipse.wst.jsdt.doc/reference/api/org/eclipse/wst/jsdt/core/dom/AST.html). 이것은 현재의 필요에 비해 너무 무거울 수도 있지만 고맙습니다. - 나는 그 사실을 모르고 있었고, 나 자신을 알고 있었고, 나는 나중에 그것을 빨리 필요로 할 것입니다. :) – genobis

1

Java가 정규가 아니기 때문에이 경우 정규 표현식이 잘리지 않습니다. 가장 좋은 방법은 Java 구문을 이해하고이를 기반으로하는 파서를 만드는 것입니다. 운 좋게 ANTLRJava 1.6 grammar (및 1.5 grammar)입니다.

제한적인 사용의 경우에는 쉽게 변수 할당 규칙을 확장하고 필요한 정보를 얻을 수 있습니다. 그것은 약간의 학습 곡선이지만 이것은 아마도 빠르고 정확한 솔루션을위한 최선의 최상의 것입니다.

+0

원래 질문은 자바 스크립트가 아니라 자바를위한 것이 었습니다. ANTLR에는 JS 문법도 있습니다 (여기 : http://www.antlr.org/grammar/1206736738015/JavaScript.g). 하지만 언제나처럼 대답이 극도로 복잡해지기 시작하면 개발자가 먼저 올바른 질문을했는지 묻습니다. @ genobis - 왜 이것을해야합니까? – AndyT

+0

@genobis - Regex가 작동하지 않는 이유에 대한 내 대답을 참조하십시오. – AndyT

관련 문제