JavaやPerlの正規表現は、本来の言語クラスとしての正規表現から拡張されたものがいろいろ使えます。
ある程度正規表現が使えてくると、微妙な表現が作れなくて困ったりします。
たとえば「グループの否定」。
とか、できたらうれしいことがあるんです。しかしそういうずばり否定というのはない。
解決法
「否定先読み」を使います。この、先読み・後読みグループは使いこなせると便利そう。
といった感じです。少々強引な感じですが動きました。
^や$は完全マッチのためにつけてあるだけで、必ずしも必要ありません。
?!が否定先読み、?:は括弧を先方参照としないためにつけたフラグです。