2012-03-14 3 views
0

개인 프로젝트로서 Go (lang)을 무언가에 적용하여 배우려고 노력하면서 EMCAScript/JavaScript "컴파일러"를 작성했습니다. 모두 (처음에) 수행하면 다른 .js 파일을 포함 할 수 있습니다.Golang 정규식 - 내가 뭘 잘못하고 있니?

기능을 제외하고는, 나는 regexp 꾸러미를 이해하려고 노력하면서 내 머리카락을 꺼내고있다. 정규식이 ^\s*include\("([^"]+)"\);과 같이하지 않습니다 따라서 왜, 나는 이미 정규 표현식의 이동의 부분 집합을 우연히 발견 한

// Note: "lines" is an array of strings. 

var includeRegex, _ = regexp.Compile("^[ \t]*include[(]{1}\"([^\"]+)\"[)]{1};") 
for _, line := range lines { 
    var isInclude = includeRegex.Match([]byte(line)) 
    if isInclude { 
     var includeFile = includeRegex.FindString(line) 
     fmt.Println("INCLUDE", includeFile) 
    } else { 
     // ... 
    } 

: 여기에 원하는 일을하지 않는 것 코드 조각입니다. 나는 이미 RegexPal에서 선호도와 Go 스타일의 정규식을 모두 테스트했으며, 둘 다 확실히 작동합니다. 경기는 결코 생기지 않는 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 그것은 가치가 무엇인지에 대한

, 내가 지금 같은 모습을 구문 분석을 시도하고있는 include() 문 :

include("somefile.js"); 

편집 : 그것은 가치가 무엇인지, 내가 코드 here를 유지하고있다하십시오.

이 매주 최신으로 작동하는 것 같다
+0

"문자 클래스에 없을 때는 다시 한 번 이스케이프 처리해야 할 것 같습니다. 현재 백 슬래시는 캡슐화 된 문자열에 있기 때문에 현재 만드는 것입니다." – Leif

+0

그래서'\ "의 모든 인스턴스를'\\"'로 변경해야한다는 것을 의미합니까? 나는 그것을 시도하고, 그것은 작동하지 않았다. – nesv

+0

오, 그리고 backticks에서 "문자열"을 포장도 작동하지 않습니다. – nesv

답변

1

package main 

import (
     "fmt" 
     "log" 
     "regexp" 
     "strings" 
) 

func main() { 
     includeRegex, err := regexp.Compile(`^\s*include\("(\\\"|[^"])+"\);`) 
     if err != nil { 
       log.Fatal(err) 
     } 

     for _, line := range strings.Split(` 
foo 
include "abc.def" 
include("file.js"); 
      include "me\"to\"" 
      include("please\"!\""); 
     nothing here   
`, "\n") { 
       if includeRegex.Match([]byte(line)) { 
         includeFile := includeRegex.FindString(line) 
         fmt.Println("INCLUDE", includeFile) 
       } else { 
         fmt.Printf("no match for \"%s\"\n", line) 
       } 
     } 
} 

출력 :

$ go build && ./tmp 
no match for "" 
no match for "foo" 
no match for "include "abc.def"" 
INCLUDE include("file.js"); 
no match for "  include "me\"to\""" 
INCLUDE  include("please\"!\""); 
no match for " nothing here  " 
no match for "" 
$ 
+0

대단히 감사합니다! 매주 업데이트하면 (r60 릴리즈 이후 변경 사항을 수용하기 위해 약간의 리팩토링을해야하지만)이 작업을 수행하는 것처럼 보였습니다. – nesv

1

프로그램의 시작 부분에 다음 줄을 넣어보십시오 :

println(runtime.Version()) 

그것은 인쇄해야 weekly.2012-03-13 또는 그 날짜에 가까운 것이 있습니다.

+0

'release.r60.3 9516'을 실행하고있는 것으로 보입니다. 주간 빌드를 업데이 트하고 거기에서 일이 어떻게 볼 수 – nesv

+0

... 내 StackOverflow 점수가 15 점을받을 것 같습니다 :) –

+0

Ugh - 최신 릴리스를 실행하는 것과 반대로 최신 주간으로 업데이트하는 것 같습니다 거의 모든 코드를 깨뜨릴 수 있습니다. * fffffffuuuuuuuuuuu * – nesv

관련 문제