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 關注
- 126 瀏覽
添加回答
舉報