Golang Регулярные выражения - что я делаю неправильно? - PullRequest
0 голосов
/ 14 марта 2012

В качестве личного проекта, пытаясь изучить Go (lang), применяя его к чему-либо, я пишу «компилятор» EMCAScript / JavaScript; все, что он (первоначально) сделает, это позволит вам включить другие файлы .js.

Помимо функциональности, я выдергиваю волосы, пытаясь выяснить пакет regexp. Вот фрагмент, который, кажется, не делает то, что я хочу:

// 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 {
      // ...
   }

Я уже наткнулся на подмножество регулярных выражений Go, поэтому и регулярное выражение не читается как ^\s*include\("([^"]+)"\);. Я уже тестировал как RegexPal, так и ReGeXPal, и оба они определенно работают. Совпадение никогда не происходит; что я делаю не так?

Что бы это ни стоило, оператор include(), который я пытаюсь разобрать, выглядит так:

include("somefile.js");

РЕДАКТИРОВАТЬ: Для чего это стоит, я держу код здесь .

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Попробуйте поставить следующую строку в начале вашей программы:

println(runtime.Version())

Это должно вывести weekly.2012-03-13 или что-то близкое к этой дате.

1 голос
/ 14 марта 2012

Это, кажется, работает с последним еженедельным

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 ""
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...