var str3 = str.replace(/(^|[^\[])\^/g, '$1');

g フラグは、一致するだけ、複数にマッチする

$n は、( )で囲んだ部分に、一致した部分。
$1 は、1つ目の( )、$2 なら、2つ目の( )

^ は、文字列の先頭に一致する。^A なら、先頭がA。
ただし、[ ]の先頭にあると、否定の意味になる

[abc][a-c]は、a, b, c のどれかの1文字に一致するが、
[^abc]は、a, b, c のどれかの1文字に一致しない文字を表す

\ は、特殊文字をエスケープする。
特殊文字の意味をなくして、通常の文字として扱う。
\^ なら、^ の特殊な意味をなくして、単に、^ 文字を表す

\[ なら、[ 。
[ ] の中で、[ を使えないから、\[ と書いている。
つまり、[^\[] は外側の、[ ] を外すと、^\[ となり、[ 以外の文字

| は、どちらかの文字を表す。A|B なら、A か、B

(^|[^\[])\^ は、1文字目が、^ または、[ 以外の文字で、
2文字目が、^ にマッチする。
$1 で、( )内は、1文字目だけを取り出す