From 61fda0b1cad43ef7ce88ab7ad36be69fcd8cf8b3 Mon Sep 17 00:00:00 2001 From: nesstord <56038047+nesstord@users.noreply.github.com> Date: Tue, 6 Dec 2022 23:45:27 +0700 Subject: [PATCH] Fix binary string regex (#1415) --- lib.go | 19 ++++--------------- lib_test.go | 7 ++++--- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/lib.go b/lib.go index 16170a71..27b5ab77 100644 --- a/lib.go +++ b/lib.go @@ -702,8 +702,8 @@ func isNumeric(s string) (bool, int, float64) { } var ( - bstrExp = regexp.MustCompile(`_x[a-zA-Z\d]{4}_`) - bstrEscapeExp = regexp.MustCompile(`x[a-zA-Z\d]{4}_`) + bstrExp = regexp.MustCompile(`_x[a-fA-F\d]{4}_`) + bstrEscapeExp = regexp.MustCompile(`x[a-fA-F\d]{4}_`) ) // bstrUnmarshal parses the binary basic string, this will trim escaped string @@ -729,16 +729,7 @@ func bstrUnmarshal(s string) (result string) { } if bstrExp.MatchString(subStr) { cursor = match[1] - v, err := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`) - if err != nil { - if l > match[1]+6 && bstrEscapeExp.MatchString(s[match[1]:match[1]+6]) { - result += subStr[:6] - cursor = match[1] + 6 - continue - } - result += subStr - continue - } + v, _ := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`) result += v } } @@ -769,12 +760,10 @@ func bstrMarshal(s string) (result string) { } if bstrExp.MatchString(subStr) { cursor = match[1] - _, err := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`) - if err == nil { + if _, err := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`); err == nil { result += "_x005F" + subStr continue } - result += subStr } } if cursor < l { diff --git a/lib_test.go b/lib_test.go index e96704f6..ec5fd640 100644 --- a/lib_test.go +++ b/lib_test.go @@ -305,18 +305,19 @@ func TestBstrUnmarshal(t *testing.T) { "*_x0008_*": "*\b*", "*_x4F60__x597D_": "*你好", "*_xG000_": "*_xG000_", - "*_xG05F_x0001_*": "*_xG05F*", + "*_xG05F_x0001_*": "*_xG05F\x01*", "*_x005F__x0008_*": "*_\b*", "*_x005F_x0001_*": "*_x0001_*", "*_x005f_x005F__x0008_*": "*_x005F_\b*", - "*_x005F_x005F_xG05F_x0006_*": "*_x005F_xG05F*", + "*_x005F_x005F_xG05F_x0006_*": "*_x005F_xG05F\x06*", "*_x005F_x005F_x005F_x0006_*": "*_x005F_x0006_*", "_x005F__x0008_******": "_\b******", "******_x005F__x0008_": "******_\b", "******_x005F__x0008_******": "******_\b******", + "_x000x_x005F_x000x_": "_x000x_x000x_", } for bstr, expected := range bstrs { - assert.Equal(t, expected, bstrUnmarshal(bstr)) + assert.Equal(t, expected, bstrUnmarshal(bstr), bstr) } }