遍历Go字符串以提取特定子字符串

huangapple go评论136阅读模式
英文:

Iterating over Go string to extract specific substrings

问题

我开始学习Go,并且想要实现一些算法。我想要遍历一个字符串,然后提取一些子字符串,例如:p -(40) *(GOT) +(FF) 应该返回一个类似这样的数组:

我写了一些代码,但是有点模糊:

  1. import (
  2. "strings"
  3. )
  4. func find(input string){
  5. var result []string
  6. a := strings.SplitN(input, "-(", 2)
  7. result[0] = a[0]
  8. b := strings.SplitN(a[1], ") *(", 2)
  9. result[1] = b[0]
  10. c := strings.SplitN(a[1], ") +(", 2)
  11. result[2] = c[0]
  12. d := strings.SplitN(a[1], ")", 2)
  13. result[3] = d[0]
  14. }

有人可以纠正我或者提供更简单的方法吗?谢谢!

英文:

I started learning Go and I want to implement some algorithm.
I want to iterate over a string and then extract some substrings for example : p -(40) *(GOT) +(FF)
should return an array like this:

I wrote something like this but it's vague:

<!-- language: lang-golang -->

  1. import (
  2. &quot;strings&quot;
  3. )
  4. func find(input string){
  5. var result []string
  6. a := strings.SplitN(input, &quot;-(&quot;, 2);
  7. result[0] = a[0]
  8. b := strings.SplitN(a[1], &quot;) *(&quot;, 2)
  9. result[1] = b[0]
  10. c := strings.SplitN(a[1], &quot;) +(&quot;, 2)
  11. result[2] = c[0]
  12. d := strings.SplitN(a[1], &quot;)&quot;, 2)
  13. result[3] = d[0]
  14. }

Can someone please correct me or suggest something easier? Thanks!

答案1

得分: 1

你可以使用strings.FieldsFunc函数,像下面这个示例代码一样:

  1. package main
  2. import "fmt"
  3. import "strings"
  4. func find(input string) []string {
  5. return strings.FieldsFunc(input, split)
  6. }
  7. func main() {
  8. strs := find("p -(40) *(GOT) +(FF)")
  9. str := strings.Replace(fmt.Sprint(strs), " ", ", ", -1)
  10. fmt.Println(str)
  11. }
  12. func split(r rune) bool {
  13. return r == ' ' || r == '-' || r == '(' || r == ')' || r == '*' || r == '+'
  14. }

输出结果为:

你也可以使用strings.Fieldsstrings.Trim函数,像下面这个示例代码一样:

  1. package main
  2. import "fmt"
  3. import "strings"
  4. func main() {
  5. fmt.Println(find("p -(40) *(GOT) +(FF)"))
  6. }
  7. func find(input string) []string {
  8. strs := strings.Fields(input)
  9. result := make([]string, 0, len(strs))
  10. for _, v := range strs {
  11. s := strings.Trim(v, "()+-*")
  12. if len(s) > 0 {
  13. result = append(result, s)
  14. }
  15. }
  16. return result
  17. }

输出结果为:

对于你的特殊情况,也可以使用下面这个示例代码:

  1. package main
  2. import "fmt"
  3. import "strings"
  4. func main() {
  5. fmt.Println(find("p -(40) *(GOT) +(FF)"))
  6. }
  7. func find(input string) []string {
  8. strs := strings.Fields(input)
  9. for i := 0; i < len(strs); i++ {
  10. strs[i] = strings.Trim(strs[i], "()+-*")
  11. }
  12. return strs
  13. }

输出结果为:

如果你需要输出形如

的字符串,可以尝试下面这个示例代码:

  1. package main
  2. import "fmt"
  3. import "strings"
  4. func main() {
  5. strs := find("p -(40) *(GOT) +(FF)")
  6. str := strings.Replace(fmt.Sprint(strs), " ", ", ", -1)
  7. fmt.Println(str)
  8. }
  9. func find(input string) []string {
  10. strs := strings.Fields(input)
  11. for i := 0; i < len(strs); i++ {
  12. strs[i] = strings.Trim(strs[i], "()+-*")
  13. }
  14. return strs
  15. }

输出结果为:

英文:

You may use strings.FieldsFunc, like this working sample code:

<!-- language: lang-golang -->

  1. package main
  2. import &quot;fmt&quot;
  3. import &quot;strings&quot;
  4. func find(input string) []string {
  5. return strings.FieldsFunc(input, split)
  6. }
  7. func main() {
  8. strs := find(&quot;p -(40) *(GOT) +(FF)&quot;)
  9. str := strings.Replace(fmt.Sprint(strs), &quot; &quot;, &quot;, &quot;, -1)
  10. fmt.Println(str)
  11. }
  12. func split(r rune) bool {
  13. return r == &#39; &#39; || r == &#39;-&#39; || r == &#39;(&#39; || r == &#39;)&#39; || r == &#39;*&#39; || r == &#39;+&#39;
  14. }

output:


You may use strings.Fields then strings.Trim, like this working sample code:

<!-- language: lang-golang -->

  1. package main
  2. import &quot;fmt&quot;
  3. import &quot;strings&quot;
  4. func main() {
  5. fmt.Println(find(&quot;p -(40) *(GOT) +(FF)&quot;))
  6. }
  7. func find(input string) []string {
  8. strs := strings.Fields(input)
  9. result := make([]string, 0, len(strs))
  10. for _, v := range strs {
  11. s := strings.Trim(v, &quot;()+-*&quot;)
  12. if len(s) &gt; 0 {
  13. result = append(result, s)
  14. }
  15. }
  16. return result
  17. }

output:


Also this works for your special case:

<!-- language: lang-golang -->

  1. package main
  2. import &quot;fmt&quot;
  3. import &quot;strings&quot;
  4. func main() {
  5. fmt.Println(find(&quot;p -(40) *(GOT) +(FF)&quot;))
  6. }
  7. func find(input string) []string {
  8. strs := strings.Fields(input)
  9. for i := 0; i &lt; len(strs); i++ {
  10. strs[i] = strings.Trim(strs[i], &quot;()+-*&quot;)
  11. }
  12. return strs
  13. }

output:


And if you need output like this string:

, try this working sample code:

<!-- language: lang-golang -->

  1. package main
  2. import &quot;fmt&quot;
  3. import &quot;strings&quot;
  4. func main() {
  5. strs := find(&quot;p -(40) *(GOT) +(FF)&quot;)
  6. str := strings.Replace(fmt.Sprint(strs), &quot; &quot;, &quot;, &quot;, -1)
  7. fmt.Println(str)
  8. }
  9. func find(input string) []string {
  10. strs := strings.Fields(input)
  11. for i := 0; i &lt; len(strs); i++ {
  12. strs[i] = strings.Trim(strs[i], &quot;()+-*&quot;)
  13. }
  14. return strs
  15. }

output:


huangapple
  • 本文由 发表于 2016年8月22日 23:02:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/39082892.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定