|
カテゴリ:正規表現
知ってる人には初歩の初歩なんだろうけど、知らなかったのでメモ。
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 がマッチするんじゃないかと。 つまり、正規表現の最短一致は 「文字列の先頭から比較して最短」のマッチを行うのであって、 「前からも後ろからも見て最短」のマッチを行うほど親切じゃない。 これ、どっかにきちんとした説明ないかな。 お気に入りの記事を「いいね!」で応援しよう
|