扫描未正确匹配单引号

我正在处理一些Go代码,但我很难弄清楚为什么我的字符串没有被正确扫描。

我得到了一个如下所示的字符串:

"ERROR: 1: something happened 'here'"

我试图像这样扫描它:

n, err := fmt.Sscanf("ERROR: 1: something happened 'here'", "ERROR: 1: something happened '%50s'", &value)

但是,每次我检查值的结果时,我都会得到这样的东西:

here'

最后一个单引号的保留位置。

任何想法如何解决这个问题?我认为这种情况不会是非确定性的,因为函数不能在没有引号的情况下完成格式化。

当然,我可以简单地删除最后一个字符,但我更喜欢基于的解决方案。fmt


拉莫斯之舞
浏览 57回答 1
1回答

MM们

内置调频器。扫描仪无法执行您要执行的操作。如果目标文本用双引号换行,则可以使用说明符。%q或者,如果目标是单个换行字符,则可以使用 。但是因为你的目标都不是这些,所以没有内置的东西。因此,您的选项是 ,或者使用自定义扫描仪,甚至只是 。如果你坚持使用,你可以做一个自定义扫描仪,但它可能是最糟糕的选择:text/scannerregexpbufiostrings.Splitfmtpackage mainimport "fmt"type quote struct { tok string }func (q *quote) Scan(state fmt.ScanState, verb rune) error {   tok, err := state.Token(false, func(r rune) bool {      return r != 0x27 // '   })   if err != nil {      return err   }   if _, _, err := state.ReadRune(); err != nil {      if len(tok) == 0 {         panic(err)      }   }   q.tok = string(tok)   return nil}例:package mainimport (   "fmt"   "strings")func main() {   r := strings.NewReader("ERROR: 1: something happened 'here'")   for {      var q quote      _, err := fmt.Fscan(r, &q)      if err != nil {         break      }      fmt.Printf("%q\n", q.tok)   }}结果:"ERROR: 1: something happened ""here"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go