diff --git a/core/text/regex/virtual_machine/virtual_machine.odin b/core/text/regex/virtual_machine/virtual_machine.odin index 169d8132d..e90a27e63 100644 --- a/core/text/regex/virtual_machine/virtual_machine.odin +++ b/core/text/regex/virtual_machine/virtual_machine.odin @@ -203,18 +203,22 @@ add_thread :: proc(vm: ^Machine, saved: ^[2 * common.MAX_CAPTURE_GROUPS]int, pc: } case .Assert_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size - if sp == 0 || sp == len(vm.memory) { + + left_is_wc := false + if sp > 0 { + left_is_wc = is_word_class(vm.current_rune) + } + + right_is_wc := false + if sp < len(vm.memory) { + right_is_wc = is_word_class(vm.next_rune) + } + + if left_is_wc != right_is_wc { pc += size_of(Opcode) continue - } else { - last_rune_is_wc := is_word_class(vm.current_rune) - this_rune_is_wc := is_word_class(vm.next_rune) - - if last_rune_is_wc && !this_rune_is_wc || !last_rune_is_wc && this_rune_is_wc { - pc += size_of(Opcode) - continue - } } + case .Assert_Non_Word_Boundary: sp := vm.string_pointer+vm.current_rune_size if sp != 0 && sp != len(vm.memory) { diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index 8369444b9..15b5504e4 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -1270,6 +1270,16 @@ iterator_vectors := []Iterator_Test{ {pos = {{0, 2}}, groups = {"a\n"}}, }, }, + // https://github.com/odin-lang/Odin/issues/6323 + // Test `\b` in iterator + { + "can, can't, 'can't'", `\b[a-z0-9']+\b`, {}, + { + {pos = {{0, 3}}, groups = {"can"}}, + {pos = {{5, 10}}, groups = {"can't"}}, + {pos = {{13, 18}}, groups = {"can't"}}, + }, + } } @test