2012-11-11 107 views
6

我試圖在字符串中找到命名捕獲組的開始,以創建一個簡單的解析器(請參閱related question)。爲此,extract函數會記住last4變量中的最後一個字符。如果最後4個字符等於「(P <?」這是一個捕獲組的開頭:!在Go中比較字符串

package main 

import "fmt" 

const sample string = `/(?P<country>m((a|b).+)(x|y)n)/(?P<city>.+)` 

func main() { 
    extract(sample) 
} 

func extract(regex string) { 
    last4 := new([4]int32) 
    for _, c := range regex { 
     last4[0], last4[1], last4[2], last4[3] = last4[1], last4[2], last4[3], c 
     last4String := fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3]) 
     if last4String == "(?P<" { 
      fmt.Print("start of capturing group") 
     } 
    } 
} 

http://play.golang.org/p/pqA-wCuvux

但這個代碼打印什麼last4String == "(?P<"是不正確的,雖然出現這種substrin在輸出,如果我打印last4String內循環。如何去比較字符串呢?

,並沒有爲Int32數組轉換爲字符串比fmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])

更優雅的方式

還有什麼比這更好的?我的代碼對我來說看起來有點不雅。

回答

3

如果不是用於自學或類似工作,您可能需要使用標準庫中現有的RE parser,然後「行走」AST來做任何需要的操作。

func Parse(s string, flags Flags) (*Regexp, error) 

解析解析正則表達式字符串s,由指定的標誌控制, 並返回一個正則表達式語法分析樹。關於軟件包正則表達式的 頂級註釋中描述了該語法。

甚至還有一個helper您的任務。

EDIT1:您的代碼修補:

package main 

import "fmt" 

const sample string = `/(?P<country>m((a|b).+)(x|y)n)/(?P<city>.+)` 

func main() { 
     extract(sample) 
} 

func extract(regex string) { 
     var last4 [4]int32 
     for _, c := range regex { 
       last4[0], last4[1], last4[2], last4[3] = last4[1], last4[2], last4[3], c 
       last4String := fmt.Sprintf("%c%c%c%c", last4[0], last4[1], last4[2], last4[3]) 
       if last4String == "(?P<" { 
        fmt.Println("start of capturing group") 
       } 
     } 
} 

(也here

EDIT2:您的代碼重寫爲:

package main 

import (
     "fmt" 
     "strings" 
) 

const sample string = `/(?P<country>m((a|b).+)(x|y)n)/(?P<city>.+)` 

func main() { 
     extract(sample) 
} 

func extract(regex string) { 
     start := 0 
     for { 
       i := strings.Index(regex[start:], "(?P<") 
       if i < 0 { 
         break 
       } 

       fmt.Printf("start of capturing group @ %d\n", start+i) 
       start += i + 1 
     } 
} 

(也here