最短一致の落とし穴
知ってる人には初歩の初歩なんだろうけど、知らなかったのでメモ。str="grandparent/parent/children/grandchildren"てな文字列から/grandchildrenを除いたgrandparent/parent/childrenを得たいと、str.replace(/[/].*?$/,'')なんてやってみるとgrandparent/parent/childrenではなくgrandparentになっちゃう。powershellでこの現象に遭遇し、javascriptとエディタの正規表現でも試したところ、結果は同じ。量指定子とか最短一致とか非強欲とかいろいろググったけど、説明にたどりつけなかったので、自分なりに考えてみた。正規表現エンジンの気持ちになって、/[/].*?$/を考えると文字列を先頭から調べていって最初の[/]にヒットするのはここ。^grandparent/parent/children/grandchildren$^grandparent/で、ここから最短で末尾までをたどると、/parent/children/grandchildrenがマッチするんじゃないかと。つまり、正規表現の最短一致は「文字列の先頭から比較して最短」のマッチを行うのであって、「前からも後ろからも見て最短」のマッチを行うほど親切じゃない。これ、どっかにきちんとした説明ないかな。