如何在golang中将双引号中的内容与regexp匹配?

时间:2018-09-12 15:48:36

标签: json regex go

content := `{null,"Age":24,"Balance":33.23}`
rule,_ := regexp.Compile(`"([^\"]+)"`)
results := rule.FindAllString(content,-1)
fmt.Println(results[0]) //"Age" 
fmt.Println(results[1]) //"Balance"

有一个json字符串,其值看起来像是“ null”。

此json来自网络api,我不想替换其中的任何内容。

我想使用正则表达式来匹配此json中没有双引号的所有键,并且输出是``Age''和``Balance''而不是``“ Age”``和“”余额”``。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用正则表达式匹配引号之间的任何字符(例如您的示例或".*?"),然后在引号内放入匹配组(也称为“ submatch”)或返回相关的子字符串匹配,分别使用regexp.FindAllStringSubmatch(...)regexp.FindAllString(...)

例如(Go Playground):

func main() {
  str := `{null,"Age":24,"Balance":33.23}`

  fmt.Printf("OK1: %#v\n", getQuotedStrings1(str))
  // OK1: []string{"Age", "Balance"}
  fmt.Printf("OK2: %#v\n", getQuotedStrings2(str))
  // OK2: []string{"Age", "Balance"}
}

var re1 = regexp.MustCompile(`"(.*?)"`) // Note the matching group (submatch).

func getQuotedStrings1(s string) []string {
  ms := re1.FindAllStringSubmatch(s, -1)
  ss := make([]string, len(ms))
  for i, m := range ms {
    ss[i] = m[1]
  }
  return ss
}

var re2 = regexp.MustCompile(`".*?"`)

func getQuotedStrings2(s string) []string {
  ms := re2.FindAllString(s, -1)
  ss := make([]string, len(ms))
  for i, m := range ms {
    ss[i] = m[1 : len(m)-1] // Note the substring of the match.
  }
  return ss

}

请注意,如果性能至关重要,则基于简单基准测试,第二个版本(不包含子匹配项)可能会稍快一些。