3 回答
TA贡献1828条经验 获得超6个赞
这似乎对我有用:
import "regexp"
re:=regexp.MustCompile("[0-9A-Za-z]+")
val:=re.FindAllString(jsonStr,-1)[0]
TA贡献1757条经验 获得超8个赞
正如评论者所指出的,您的示例字符串不是有效的 JSON,因为用大括号分隔的 JSON 文档必须是具有键值对列表的对象(例如{"x":1}
,数字是普通的(例如2
))。但是,这个简单的“大括号括起”符号integer” 可以通过多种方式轻松解析,最终通过检查OPEN_BRACE, DIGIT+, CLOSE_BRACE
.
下面的示例代码检查给定字符串的第一个符文是左大括号{
,最后一个是右大括号}
,中间的所有内容都可以使用以下方法解析为整数strconv.ParseInt(...)
:
func main() {
ss := []string{"{1}", "{2}", "{-123}", "{foo}", "{10", "20}", "30"}
for _, s := range ss {
x, err := parseBraceNumber(s)
fmt.Printf("s=%-10qx=%-10derr=%v\n", s, x, err)
}
// s="{1}" x=1 err=<nil>
// s="{2}" x=2 err=<nil>
// s="{-123}" x=-123 err=<nil>
// s="{foo}" x=0 err=invalid brace number "{foo}"
// s="{10" x=0 err=invalid brace number "{10"
// s="20}" x=0 err=invalid brace number "20}"
// s="30" x=0 err=invalid brace number "30"
}
func parseBraceNumber(s string) (int64, error) {
if len(s) < 3 || s[0] != '{' || s[len(s)-1] != '}' {
return 0, fmt.Errorf("invalid brace number %q", s)
}
x, err := strconv.ParseInt(s[1:len(s)-1], 10, 64)
if err != nil {
return 0, fmt.Errorf("invalid brace number %q", s)
}
return x, nil
}
当然,其他策略也是可能的(例如使用正则表达式),最终由您决定哪种实现最适合您的用例。
TA贡献1770条经验 获得超3个赞
正则表达式的一些替代方案因为它们占用大量资源并且往往比其他解决方案慢,为简洁起见忽略错误。实际上他们不会。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "{1}"
num, _ := strconv.ParseInt(string(str[1]), 10, 64)
fmt.Println(num)
}
或者更强大的东西,不关心字段中的位数{}。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "{341}"
num, _ := strconv.ParseInt(string(str[1:len(str)-1]), 10, 64)
fmt.Println(num)
}
显示正则表达式比其他解决方案慢多少的小型基准图像。当其他选项可用或性能不是问题/关注时,应使用它们。
即使是这样的东西也会执行正则表达式
var n string
for _, r := range str {
if unicode.IsDigit(r) {
n += string(r)
}
}
基准代码 https://goplay.space/#PLMtSrMTN9k
- 3 回答
- 0 关注
- 95 浏览
添加回答
举报