带有转义新行的bufio.ScanLines

时间:2015-05-25 04:39:24

标签: go

我正在尝试调整bufio.ScanLines,以便了解转义的新行\\n

输入:

line1 \
continues on line2

预期产出:

["line1 continues on line2"]

现在bufio.ScanLines的输出(参见下面的示例代码)是:

["line1 \\", "continues on line2"]

示例代码:

s := bufio.NewScanner(f)
s.Split(bufio.ScanLines)

for s.Scan() {
    fmt.Println(s.Text())
}

这里最好的方法是什么?寻找仍然通过https://golang.org/src/bufio/scan_test.go中的测试的实现。

1 个答案:

答案 0 :(得分:-3)

我想到了一些明显的方法。

首先,看一下source for bufio.ScanLines,它不是很大,您可以从一开始就从头开始轻松实现自己的bufio.SplitFunc来做你想做的事。

其次,你可以在一个循环中编写一个bufio.SplitFunc来调用bufio.ScanLines,只要它返回以你的转义字符结尾的那些,然后返回组合的标记,就可以组合标记。

考虑到第一种方法的简短和简单,这是我可能会做的。第二种方法可能会持续时间长,效率低,并且可能需要状态,因为在返回(0, nil, nil)以请求更多输入时,您需要存储组合令牌。所以./ / p >

另一个解决方案是实现Transformer(来自golang.org/x/text/transform包)从输入中删除相关的转义字符(例如删除"\\\n")并使用transform.NewReader来制作一个过滤后的读者,然后根据需要使用(例如,使用常规bufio.Scanner传递给ScanLines)。

在任何情况下,您都可以从scan_test.go复制相应的测试,并为转义的换行行为添加自己的测试。请注意bufio.MaxScanTokenSize