diff --git a/vlib/regex/regex_anchor_test.v b/vlib/regex/regex_anchor_test.v new file mode 100644 index 0000000000..488ab39b11 --- /dev/null +++ b/vlib/regex/regex_anchor_test.v @@ -0,0 +1,22 @@ +import regex + +fn test_anchor_start() { + mut re := regex.regex_opt(r'^\w+') or { panic(err) } + start, end := re.find('id.') + assert start == 0 + assert end == 2 +} + +fn test_anchor_end() { + mut re := regex.regex_opt(r'\w+$') or { panic(err) } + start, end := re.find('(id') + assert start == 1 + assert end == 3 +} + +fn test_anchor_both() { + mut re := regex.regex_opt(r'^\w+$') or { panic(err) } + start, end := re.find('(id)') + assert start == -1 + assert end == -1 +} diff --git a/vlib/regex/regex_util.v b/vlib/regex/regex_util.v index f666b8ae37..68d7fd5fae 100644 --- a/vlib/regex/regex_util.v +++ b/vlib/regex/regex_util.v @@ -202,6 +202,14 @@ pub fn (mut re RE) find(in_txt string) (int, int) { re.groups[gi] += i gi++ } + // when ^ (f_ms) is used, it must match on beginning of string + if (re.flag & f_ms) != 0 && s > 0 { + break + } + // when $ (f_me) is used, it must match on ending of string + if (re.flag & f_me) != 0 && i + e < in_txt.len { + break + } return i + s, i + e } i++