为了账号安全,请及时绑定邮箱和手机立即绑定

扫描未正确匹配单引号

扫描未正确匹配单引号

Go
拉莫斯之舞 2022-09-12 21:07:01
我正在处理一些Go代码,但我很难弄清楚为什么我的字符串没有被正确扫描。我得到了一个如下所示的字符串:"ERROR: 1: something happened 'here'"我试图像这样扫描它:n, err := fmt.Sscanf("ERROR: 1: something happened 'here'", "ERROR: 1: something happened '%50s'", &value)但是,每次我检查值的结果时,我都会得到这样的东西:here'最后一个单引号的保留位置。任何想法如何解决这个问题?我认为这种情况不会是非确定性的,因为函数不能在没有引号的情况下完成格式化。当然,我可以简单地删除最后一个字符,但我更喜欢基于的解决方案。fmt
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

内置调频器。扫描仪无法执行您要执行的操作。如果目标文本用双引号换行,则可以使用说明符。%q


或者,如果目标是单个换行字符,则可以使用 。但是因为你的目标都不是这些,所以没有内置的东西。因此,您的选项是 ,或者使用自定义扫描仪,甚至只是 。如果你坚持使用,你可以做一个自定义扫描仪,但它可能是最糟糕的选择:text/scannerregexpbufiostrings.Splitfmt


package main

import "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 main


import (

   "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"


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 56 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信