From: "sawa (Tsuyoshi Sawada)" Date: 2022-01-11T08:54:09+00:00 Subject: [ruby-core:107048] [Ruby master Bug#18471] Regex#match(re, position) with start of a string anchors ^ and \A Issue #18471 has been updated by sawa (Tsuyoshi Sawada). > I [...] expect [...] staring from position 6 in ���hello world��� [to] be equivalent to staring with position 0 in [the sub-]string ���world��� I do not think so. Moving "the position in the string to begin the search" does not mean the string will be truncated. It only moves the cursor position in the same string. It does not create a new string or a new edge of a string. On the other hand, I find the behavior of `StringScanner#scan` to be potentially confusing, but I think I can understand why it is designed so. To my understanding, as you read from a `StringScanner` instance, the matched part is consumed, the original content is truncated, and indeed new edges are created as you read from it. (Saying somewhat metaphorically. I do not know about the actual implementation.) Thus, I think `String` and `StringScanner` differ in nature. ---------------------------------------- Bug #18471: Regex#match(re, position) with start of a string anchors ^ and \A https://bugs.ruby-lang.org/issues/18471#change-95879 * Author: vlazar (Vlad Zarakovsky) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- Found this. Is it a bug in `Regex#match(re, position)`? From `Regex#match` docs > If the second parameter is present, it specifies the position in the string to begin the search. ```rb str = "hello world" /^world/.match(str, 6) # => nil /\Aworld/.match(str, 6) # => nil ``` I would expect ���specifies the position in the string to begin the search��� would mean staring from position 6 in ���hello world��� should be equivalent to staring with position 0 in a string ���world��� and thus ^ or \A should match in this case too. Consider another example. If I use the same with `StringScanner#scan` it works as I would expect: ```rb require "strscan" str = "hello world" scanner = StringScanner.new(str) scanner.pos = 6 scanner.scan /^world/ # => "world" scanner.pos = 6 scanner.scan /\Aworld/ # => "world" ``` To me these 2 cases (at least looking into current API docs) should work the same and having a difference in behavior looks like a bug to me. -- https://bugs.ruby-lang.org/ Unsubscribe: