16進表記の3の倍数にマッチする正規表現

そのまま書くと分かりにくすぎるのでperlで。

$zero="[0369CFcf]";
$one="[147ADad]";
$two="[258BEbe]";
/^(?:$zero|$one(?:$zero|(?:$one$zero*$two))*(?:$two|$one$zero*$one)|$two(?:$zero|(?:$two$zero*$one))*(?:$one|$two$zero*$two))+$/

要は16進表記の3の倍数を受理するオートマトン作って、その全てのパスを網羅するように正規表現を構成してるだけ。「だけ」といえば簡単だけど手でやるのはおそろしく面倒。オートマトンとその全てのパスを網羅する正規表現機械的に求める方法はあるはずだけど疲れたのでもういい。