調べても「先読み、後読みは位置へのマッチング」......となっていて、理解には程遠かった。
そもそも先読み、後読み、の主語も述語もないのが理解し辛さへの拍車をかけていると思う。
「本当にマッチしたいパターン」が「アンカー(位置)としてマッチしたいパターン」より先(前)にあるから先読み、後にあるから後読み。
肯定先読み
マッチした位置の先頭を基準にする。
以下の例だとFantasyの先頭のFが位置としてマーク(アンカーというらしい)される。
// 特になんでもない
'FinalFantasy'.match(/Final(Fantasy)/)[0]
// -> FinalFantasy
// 肯定先読み Fantasyが続くFinal
'FinalFantasy'.match(/Final(?=Fantasy)/)[0]
// -> Final
// ありえないが 位置にマッチしているという話
'FinalFantasy'.match(/Final(?=Fantasy)Fantasy/)[0]
// -> FinalFantasy
// Fantasyが続くFinalの後にFantasyが存在する ということ
否定先読み
肯定先読みの逆。
// Fight が続かないFinal
'FinalFantasy'.match(/Final(?!Fight)/)[0]
// -> Final
// Fantasy が続くとアンマッチ
'FinalFantasy'.match(/Final(?!Fantasy)/)
// -> null
肯定後読み
肯定先読みの。。。なんだ、逆か?
'FinalFantasy'.match(/(?<=Final)Fantasy/)[0]
// -> Fantasy
'FinalFantasy'.match(/Final(?<=Final)Fantasy/)[0]
// -> FinalFantasy
否定後読み
'FinalFantasy'.match(/(?<!Granblue)Fantasy/)[0]
// -> Fantasy
'FinalFantasy'.match(/(?<!Granblue)Fantasy/)[0]
// -> Fantasy
余談だが、中学生くらいのときに「正規表現」という言葉を聞いて「(厨二病的に)めっちゃかっこいいけどなんのためにあるのかよくわからない」と感じていた。こんな便利なものは他にないというのに。
「パターンとして扱う」と紹介された時に一番しっくりきたけれど、DBの正規化を学んだ後の方が「正規」に違和感がないかもしれない。「抽象」に近いのかな、と思う。