2016-08-22 11 views
0

私はGoの学習を始めました。アルゴリズムを実装したいと思います。 私は、文字列を反復処理して、例えば、いくつかのサブストリングを抽出したい:p -(40) *(GOT) +(FF) はこのような配列を返す必要があります。[p, 40, GOT, FF]Go文字列を繰り返して特定の部分文字列を抽出する

を私はこのような何かを書いたが、それは曖昧だ:

import (
    "strings" 

) 

func find(input string){ 
    var result []string 
    a := strings.SplitN(input, "-(", 2); 
    result[0] = a[0] 
    b := strings.SplitN(a[1], ") *(", 2) 
    result[1] = b[0] 
    c := strings.SplitN(a[1], ") +(", 2) 
    result[2] = c[0] 
    d := strings.SplitN(a[1], ")", 2) 
    result[3] = d[0] 
} 

誰かが修正してくださいすることができ私は何か簡単なことを提案しますか?ありがとう!

+0

どう正規表現についてはどうですか? – tkausl

+0

返信いただきありがとうございます!私にとってちょっと難しい、私はプログラミングのnoobie .. – jiji

+0

https://play.golang.org/p/dRfMfZhH7- –

答えて

1

あなたはこのワーキングサンプルコードのように、strings.FieldsFuncを使用することがあります。

package main 

import "fmt" 
import "strings" 

func find(input string) []string { 
    return strings.FieldsFunc(input, split) 
} 

func main() { 
    strs := find("p -(40) *(GOT) +(FF)") 
    str := strings.Replace(fmt.Sprint(strs), " ", ", ", -1) 
    fmt.Println(str) 
} 

func split(r rune) bool { 
    return r == ' ' || r == '-' || r == '(' || r == ')' || r == '*' || r == '+' 
} 

出力:

:あなたはこのワーキングサンプルコードのように、 strings.Fieldsその後、 strings.Trimを使用することができ

[p, 40, GOT, FF] 

package main 

import "fmt" 
import "strings" 

func main() { 
    fmt.Println(find("p -(40) *(GOT) +(FF)")) 
} 

func find(input string) []string { 
    strs := strings.Fields(input) 
    result := make([]string, 0, len(strs)) 

    for _, v := range strs { 
     s := strings.Trim(v, "()+-*") 
     if len(s) > 0 { 
      result = append(result, s) 
     } 
    } 
    return result 
} 

出力:

[p 40 GOT FF] 

また、これはあなたの特別なケースのために働く:

package main 

import "fmt" 
import "strings" 

func main() { 
    fmt.Println(find("p -(40) *(GOT) +(FF)")) 
} 

func find(input string) []string { 
    strs := strings.Fields(input) 
    for i := 0; i < len(strs); i++ { 
     strs[i] = strings.Trim(strs[i], "()+-*") 
    } 
    return strs 
} 

出力:

[p 40 GOT FF] 

そして、あなたはこの文字列のような出力が必要な場合: [p, 40, GOT, FF]、このワーキングサンプルコードを試してみてください。

package main 

import "fmt" 
import "strings" 

func main() { 
    strs := find("p -(40) *(GOT) +(FF)") 
    str := strings.Replace(fmt.Sprint(strs), " ", ", ", -1) 
    fmt.Println(str) 
} 

func find(input string) []string { 
    strs := strings.Fields(input) 
    for i := 0; i < len(strs); i++ { 
     strs[i] = strings.Trim(strs[i], "()+-*") 
    } 
    return strs 
} 

出力:

[p, 40, GOT, FF] 

+0

ありがとう、非常にきれいで非常に有用! – jiji

+0

私はなぜ結果のスライスの長さとして0を選択したのだろうと思っていましたか?= make([] string、0、len(strs))?ありがとう – jiji

+0

@jiji詳細な回答を参照してください:http://stackoverflow.com/a/39121360/6169399 –

関連する問題