- ベストアンサー
コードの要約
- 数値の圧縮とデコードをするコードの解説
- 正規表現を使用して特定のパターンを置換する処理が行われています
- センセーショナルなタイトルを生成する処理が含まれています
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> while (text.match(/(\D)\1{8}/)) { text = text.replace(/(\D)\1{8}/,RegExp.$1+'9'); } \D 数字以外の1文字。 () カッコで囲むと、正規表現を使った後でRegExp.$1などで使えるようになる。 カッコの組が2つ以上あるときは、それぞれRegExp.$2、RegExp.$3、、、となる。 \1 その正規表現中のカッコの組の内容。 このスクリプトでは(\D)が該当するので、数字以外の1文字が入る。 \1{8} 大カッコで囲むと直前にマッチした文字が連続することを意味する。 これは\1(上記の理由により”数字以外の文字”)が8個連続で続く場合」という意味。 (\D)\1{8} となっているため、数字以外の同じ文字が9個(1個と、8個連続の組み合わせ=9連続)で続く場合、 RegExp.$1+'9'だから、「その1文字 + '9'」 に変換する。 \D、つまり「数字以外」には記号も含まれるが、 あらかじめ.toString(31)により31進数(0-9A-U、toUpperCase()により大文字)に変換しているから、 この文字列に記号は含まれず、結果としてアルファベットのみが置換の対象となる。 例 31進数で AA -> 'A2' 31進数で BBB -> 'B3' 31進数で CCCCC -> 'C5' 10進数の20以下(最初に+10しているため)なら31進数では1桁ですから、実質、これらの圧縮は行われません。 20以下の数値変換をするなら、これで十分だと思いますが。。。 圧縮処理はしなくても、1バイトですから。 num = 20; str=num.toString(20); // 数値(数字)を20進数の文字列に変換 num=parseInt(str, 20); // 20進数の文字列を数値に変換 というか、この逆変換処理は、22以上の数字は正確に元の数値に戻らないと思います。 個人的に「+10して変換、アルファベット部分だけを逆変換の対象にする」というアルゴリズムは今後の参考になりそうなので、勉強させてもらいました。