改匹配模式为正则表达式

This commit is contained in:
eson 2018-12-23 05:04:37 +08:00
parent 081192fa2e
commit 8ca66dad60
2 changed files with 24 additions and 4 deletions

View File

@ -6,6 +6,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"reflect" "reflect"
"regexp"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
@ -706,6 +707,8 @@ type arrayPathResult struct {
value string value string
all bool all bool
} }
re *regexp.Regexp
} }
func parseArrayPath(path string) (r arrayPathResult) { func parseArrayPath(path string) (r arrayPathResult) {
@ -1098,9 +1101,17 @@ func queryMatches(rp *arrayPathResult, value Result) bool {
case ">=": case ">=":
return value.Str >= rpv return value.Str >= rpv
case "%": case "%":
return match.Match(value.Str, rpv) if rp.re == nil {
rpv = strings.Replace(rpv, `\"`, `"`, -1)
rp.re = regexp.MustCompile(rpv)
}
return rp.re.MatchString(value.Str)
case "!%": case "!%":
return !match.Match(value.Str, rpv) if rp.re == nil {
rpv = strings.Replace(rpv, `\"`, `"`, -1)
rp.re = regexp.MustCompile(rpv)
}
return !rp.re.MatchString(value.Str)
} }
case Number: case Number:
rpvn, _ := strconv.ParseFloat(rpv, 64) rpvn, _ := strconv.ParseFloat(rpv, 64)

View File

@ -390,6 +390,7 @@ func TestBasic1(t *testing.T) {
t.Fatalf("expected %v, got %v", 3, count) t.Fatalf("expected %v, got %v", 3, count)
} }
} }
func TestBasic2(t *testing.T) { func TestBasic2(t *testing.T) {
mtok := get(basicJSON, `loggy.programmers.#[age=101].firstName`) mtok := get(basicJSON, `loggy.programmers.#[age=101].firstName`)
if mtok.String() != "1002.3" { if mtok.String() != "1002.3" {
@ -399,14 +400,15 @@ func TestBasic2(t *testing.T) {
if mtok.String() != "Jason" { if mtok.String() != "Jason" {
t.Fatalf("expected %v, got %v", "Jason", mtok.String()) t.Fatalf("expected %v, got %v", "Jason", mtok.String())
} }
mtok = get(basicJSON, `loggy.programmers.#[firstName % "Bre*"].email`) mtok = get(basicJSON, `loggy.programmers.#[firstName % "Bre.*"].email`)
if mtok.String() != "aaaa" { if mtok.String() != "aaaa" {
t.Fatalf("expected %v, got %v", "aaaa", mtok.String()) t.Fatalf("expected %v, got %v", "aaaa", mtok.String())
} }
mtok = get(basicJSON, `loggy.programmers.#[firstName !% "Bre*"].email`) mtok = get(basicJSON, `loggy.programmers.#[firstName !% "Bre.*"].email`)
if mtok.String() != "bbbb" { if mtok.String() != "bbbb" {
t.Fatalf("expected %v, got %v", "bbbb", mtok.String()) t.Fatalf("expected %v, got %v", "bbbb", mtok.String())
} }
mtok = get(basicJSON, `loggy.programmers.#[firstName == "Brett"].email`) mtok = get(basicJSON, `loggy.programmers.#[firstName == "Brett"].email`)
if mtok.String() != "aaaa" { if mtok.String() != "aaaa" {
t.Fatalf("expected %v, got %v", "aaaa", mtok.String()) t.Fatalf("expected %v, got %v", "aaaa", mtok.String())
@ -1431,3 +1433,10 @@ func TestArrayValues(t *testing.T) {
} }
} }
func TestEsonRegexp(t *testing.T) {
mtok := get(`{"data": [ {"dat": "123\"", "next": [{"a": "\"32"}, {"a": "32"}]}, {"dat": "234"} ] }`, `data.#[dat % "3\""].next.#[a % "\"32"]#.a`)
if mtok.String() != `["\"32"]` {
t.Fatalf("expected %v, got %v", `"32`, mtok.String())
}
}