Rubyでプログラミングの問題を解いていますが、解答をみて、さらに公式ドキュメントを見ても理解ができなかったので質問させていただきます。
問題は
Ruby
1 2search_substr( fullText, searchText, allowOverlap = true ) 3
というメソッドの中身を作る必要があり、searchTextの文字列がfullTextの中で何度繰り返されているかを算出します。
また、allowOverlapがtrueなら重複もカウントし、falseなら重複をカウントしません。
例としては
Ruby
1 2search_substr('aa_bb_cc_dd_bb_e', 'bb') #bbが2回出現しているので2を返す 3search_substr('aaabbbcccc', 'bbb') # 1を返す 4search_substr( 'aaa', 'aa' ) # 2を返す 5search_substr( 'aaa', '' ) # 0を返す 6search_substr( 'aaa', 'aa', false ) # 1を返す 7
これに対して、解答が
Ruby
1def search_substr( fullText, searchText, allowOverlap = true ) 2 if searchText == '' 3 0 4 else 5 fullText.scan(allowOverlap ? Regexp.new("(?=(#{searchText}))") : searchText).size 6 end 7end
となっておりました。
allowOverlapがtrueの時の**Regexp.new("(?=(#{searchText}))")**について、
**?=**がどのような理由で記述されているのかがわかりません。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.htmlにて検索したら(?=pat) 肯定先読み(positive lookahead)というものが出てきたのですが、なせこれで重複をカウントできているのかが理解できません。
特にRegexp.new("(?=(#{searchText}))")にてsearch_substr( 'aaa', 'aa' )が2を返せる理由について伺いたいです。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー