2016-08-22 69 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