From e74a06dc0521f67d8a12c71969928463b15b35d2 Mon Sep 17 00:00:00 2001 From: func25 Date: Wed, 4 Sep 2024 20:38:33 +0700 Subject: [PATCH] fine tune logic --- lib/regexutil/syntax/regexp.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/regexutil/syntax/regexp.go b/lib/regexutil/syntax/regexp.go index cc51c5dda..12f6e89e4 100644 --- a/lib/regexutil/syntax/regexp.go +++ b/lib/regexutil/syntax/regexp.go @@ -217,15 +217,18 @@ func calcFlagsI(re *Regexp) (must, cant printFlags) { for i := 0; i < len(re.Rune); i += 2 { lo := max(minFold, re.Rune[i]) hi := min(maxFold, re.Rune[i+1]) + if lo > hi { + continue + } - inside += int(hi - lo) - outside += int(hi - pre) + inside += int(hi - lo + 1) + outside += int(lo - pre) pre = max(minFold, hi) } outside += int(maxFold - pre) - if inside > outside { + if inside < outside { for i := 0; i < len(re.Rune); i += 2 { lo := max(minFold, re.Rune[i]) hi := min(maxFold, re.Rune[i+1]) @@ -242,9 +245,9 @@ func calcFlagsI(re *Regexp) (must, cant printFlags) { } // Check characters outside the defined range - pre = 0 + pre = minFold for i := 0; i < len(re.Rune); i += 2 { - lo := max(minFold, re.Rune[i]) + lo := re.Rune[i] hi := min(maxFold, re.Rune[i+1]) // Check characters between `pre` and `lo` (outside the defined range) for r := pre; r < lo; r++ { @@ -254,7 +257,7 @@ func calcFlagsI(re *Regexp) (must, cant printFlags) { } } } - pre = max(minFold, hi) + pre = max(minFold, hi+1) } // Check characters between `pre` and `maxFold`