2016-08-22 72 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 == '+' 
} 

輸出:

[p, 40, GOT, FF] 

您可以使用strings.Fields然後strings.Trim,像這樣的工作示例代碼:

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 – 2016-08-24 10:59:04