diff --git a/bytes/regexp.go b/bytes/regexp.go index 66f6b65..44b2d0e 100644 --- a/bytes/regexp.go +++ b/bytes/regexp.go @@ -80,7 +80,7 @@ func Regexp(pattern string) gigaparsec.Parser[byte, string] { // when searching a RuneReader. dst := make([]byte, idx[1]-idx[0]) n, _, err := input.Read(dst) - if err != nil { + if err != nil && (!errors.Is(err, io.EOF) || n < uint64(len(dst))) { return gigaparsec.Result[byte, string]{}, fmt.Errorf("Regexp: unexpected error: %w", err) } next := input.At(input.Pos() + n) diff --git a/bytes/regexp_test.go b/bytes/regexp_test.go index b8742fc..6e409f6 100644 --- a/bytes/regexp_test.go +++ b/bytes/regexp_test.go @@ -61,6 +61,14 @@ func TestRegexp(t *testing.T) { must.NoError(t, err) test.StrContains(t, result.Message().Got(), "hella") }) + t.Run("succeeds on empty matches", func(t *testing.T) { + p := pbytes.Regexp(".*") + result, err := p(gigaparsec.MakeState(strings.NewReader(""))) + succeeded, value, _ := result.Status() + must.NoError(t, err) + must.True(t, succeeded) + must.EqOp(t, "", value) + }) } func TestRuneReader(t *testing.T) {