質問: '' 0 else fullText.scan(allowOverlap ? Regexp.new("(?=(#{searchText}))") : searchText).size end end ``` となっておりました。 allowOverlapがtrueの時の**Regexp.new("(?=(#{searchText}))")**について、 **?=**がどのような理由で記述されているのかがわかりません。 にて検索したら(?=pat) 肯定先読み(positive lookahead)というものが出てきたのですが、なせこれで重複をカウントできているのかが理解できません。 特にRegexp.new("(?=(#{searchText}))")にてsearch_substr( 'aaa', 'aa' )が2を返せる理由について伺いたいです。 よろしくお願いいたします。
回答: ``` # //は空文字にマッチする p 'abc'.scan(//) # ⇒ ["", "", "", ""] # (空文字) a (空文字) b (空文字) c (空文字) # /(?=a)/は直後に 'a' がある空文字にマッチする p 'abc'.scan(/(?=a)/) # ⇒ [""] # (空文字) a 空文字 b 空文字 c 空文字 # /(?=aba)/は直後に 'aba' がある空文字にマッチする p 'ababa'.scan(/(?=aba)/) # ⇒ ["", ""] # (空文字) a 空文字 b (空文字) a 空文字 b 空文字 a # ※ (空文字) ・・・ マッチする空文字 ```