我正在尝试调整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中的测试的实现。
答案 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
。