先読み(Lookahead)
foo(?=bar)
fooがあって、その後にbarがある場合にのみfooがマッチする
先のほうを読むだけ読んで判断するが、条件自体は結果にはかけないイメージ(なので先読み)
後読み(Lookbehind)
(?<=foo)bar
barがあって、その前にfooがある場合にのみbarがマッチする
前の方を後から読んで結果にかけるかかけないかを決めるイメージ(なので後読み)
蛇足: 記号だけ見ると初見じゃ分かりづらいが、先読みの記号パターンを見てそれの順番が逆のバージョンと考えると「まぁこういうふうにするしかないんだろうなぁ」となる(なった)
イコールを!
(感嘆符)と入れ変えると否定的先読み/後読みになる
先ほどの「ある場合」を「ない場合」に置き換えたものと考えればよいと思われる
否定的先読み
foo(?!bar)
否定的後読み
(?<!foo)bar
参考
正規表現 > 言明 - JavaScript | MDN
Firefox 78 for developers - Mozilla | MDN - 本題とはあまり関係ないが、火狐だと2020年6月末のアップデートで完全に対応されたらしい(それまでは火狐では後読み(Lookbehind)が使えなかったんだとか。ここを見るに、Chromeはそれ以前から対応してたと思われる)
regextester.com - 数ある正規表現テスターの一つ。これが気に入ってて使ってたんだけど、なぜか「後読みはjsじゃ使えませんよー」的なこと言われるので調べるきっかけになった。同じようなこと言われるサイトがほかにもあったけど、それら含めテスト自体はできる模様(規格で標準化されてないだけとか?)
追記:Look ahead/behindをLookahead/behindと続けるかどうかについては英語版MDNに倣ってとりあえずそうしてみていたのですが、検索にかけてみてもregex関連だと続けざまの用例のが多いっぽいのでこのままにさせていただきます(なんでなんだろう)。編集リクエスト感謝
(釈明の意味でこう言おうと思ってたのだけど、なぜか普通にLookahedと誤字っていたのでそれのついで程度のつもりだったのしれない。というか多分そうだけど。ともかく感謝)