単純なパーサーを作成するために、文字列内の名前付きキャプチャグループの先頭を見つけようとしています(関連する質問を参照)。これを行うために、関数は変数extract
内の文字の最後を記憶します。last4
最後の4文字が「(?P <」」と等しい場合、それはキャプチャグループの始まりです。
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<"
印刷すると、このサブストリンが出力に表示されますが、trueになることはありません。last4String
Goで文字列を比較する方法は?
そして、int32配列を文字列に変換するより洗練された方法はありfmt.Sprintf("%c%c%c%c\n", last4[0], last4[1], last4[2], last4[3])
ますか?
他にもっと良いものはありますか?私のコードは私にはややエレガントに見えません。