golang扫描仪读到读者结束

时间:2016-07-26 10:30:45

标签: string parsing go

我在StringReader上有一个bufio扫描程序。在扫描仪输出上达到某一行后,我想要阅读直到读者结束。除了注释代码之外,有没有办法用更简单的方法实现这个目的?

s := `1
2
3
4
5
6
7`

beyond5 := ""
scanner := bufio.NewScanner(strings.NewReader(s))
for scanner.Scan() {
    if strings.Contains(scanner.Text(), "5") {
        // Read all lines until EOF from scanner
        // and store in beyond5
        // for scanner.Scan() {
        //  beyond5 += scanner.Text()
        //  beyond5 += "\n"
        // }
        break
    }
}

log.Println(beyond5)

2 个答案:

答案 0 :(得分:1)

扫描仪似乎无法进行这样的操作。我们只需要使用bufio阅读器。代码是:

s := `1
2
3
4
5
6
7`

beyond5 := ""
r := strings.NewReader(s)
reader := bufio.NewReader(r)
for {
    line, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }
    if strings.Contains(line, "5") {
        b, _ := ioutil.ReadAll(reader)
        beyond5 = string(b)
        break
    }
}

log.Println(beyond5)

答案 1 :(得分:0)

这是你想要的吗? : - )

    s := `1
          2
          3
          4
          5
          6
          7`

    var beyond5 string

    if strings.Contains(s, "5") {
       scanner := bufio.NewScanner(strings.NewReader(s))
       for scanner.Scan() {
          beyond5 += scanner.Text()
        }
    }

    beyond5 += "\n"

    log.Println(beyond5)

更新:我的解决方案类似于@ abhink的解决方案,但是,它们是不同的解决方案

我使用了Split method,此方法将split(private)属性设置为SplitFunc type。这是我的实施:

var canPass bool

func mySplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
    for pos, value := range data {

        if (value < '6' && !canPass) || (value < '0' || value > '9') {
            continue
        }

        canPass = true
        return pos+1, data[pos : pos + 1], nil
    }

    return 0, nil, nil
}

现在,您必须使用Split方法,将mySplit作为参数发送。

scanner.Split(mySplit)

使用scanner.Scan()

进行简单操作
for scanner.Scan() {
        beyond5 += scanner.Text() + "\n"
}

输出:

6
7

Playground

我希望这是您正在寻找的解决方案: - )