我正在尝试适应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测试的实现。
最佳答案
我想到了一些显而易见的方法。
首先,看一下source for bufio.ScanLines
,它不是很大,您可以轻松地从头实现自己的 bufio.SplitFunc
,从修改后的副本开始执行您想要的操作。
其次,您可以在循环中编写一个称为bufio.SplitFunc
的bufio.ScanLines
,组合 token ,只要它返回以转义符结尾的 token ,然后返回组合的 token 。
考虑到第一种方法的大小和简单性,我可能会这样做。第二种方法可能会花费同样长的时间,效率会降低,并且可能需要状态,因为返回(0, nil, nil)
要求更多输入时,您需要存储到目前为止的组合 token 。
另一种解决方案是实现 Transformer
(来自golang.org/x/text/transform
包),从输入中剥离相关的转义字符(例如,删除"\\\n"
),然后使用transform.NewReader
生成过滤器,然后根据需要使用(例如,传递给bufio.Scanner
与常规ScanLines
)。
无论如何,您都可以从scan_test.go
复制适当的测试,也可以为转义的换行符行为添加自己的测试。还要小心bufio.MaxScanTokenSize
。
关于go - bufio.ScanLines与转义的新行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30431331/