先読み後読み

back
(?=pattern) 先読み
(?!pattern) 否定先読み
(?<=pattern) 後読み
(?<!pattern) 否定後読み

いずれも、ゼロ幅のマッチで、記述したパターンの文字列にはマッチしない。
ゼロ幅のマッチとは、早い話がマッチの対象が文字列ではなく、位置にマッチすること。
たとえば ^(行頭) $(行末) の、文字ではなく位置にマッチするものと似ている。


/[a-z]+(?=[0-9])/

pattern(/[a-z]+/) の後に [0-9] が続く [a-z] にマッチする。
後に [0-9] のある [a-z]+ にマッチする。[0-9] の無い [a-z]+ にはマッチしない
またマッチする範囲は [a-z]+ だけで、その後の [0-9] はマッチ対象ではない。
($& は [a-z] で、$' が [0-9] になる)
"abc012" の場合は
$& は abc
$' は 012


/[a-z]+(?![0-9])/

pattern(/[a-z]+/) の後に [0-9] が続かない [a-z]+ にマッチする。
"abc012" の場合は
$& は ab
$' は c012


/(?<=[0-9])[a-z]+/

pattern(/[a-z]+/) の前に [0-9] がある [a-z]+ にマッチする。
"012abc" の場合は
$` は 012
$& は abc


/(?<![0-9])[a-z]+/
pattern(/[a-z]+/) の前に [0-9] がない [a-z]+ にマッチする。
"012abc" の場合は
$` は 012a
$& は bc

----
$` ... パターンにマッチした部分より前にある文字列
$& ... パターンにマッチした文字列
$' ... パターンにマッチした部分より後にある文字列

back