JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで大きな文字列をnサイズのチャンクに分割する2つの方法を解説

JavaScriptで大きな文字列をnサイズの部分文字列(チャンク)に分割する方法は、主に2つあります。それぞれの特徴を理解し、用途に応じて使い分けることが大切です。

1) 従来の方法(ロジックベース)

この方法は、forループ、concat、剰余演算子(%)といった基本的な構文だけで実装する、純粋なロジックによる手法です。正規表現を使う方法に比べるとやや素朴ですが、処理の流れが分かりやすく、学習用途にも適しています。

ただし、この方法は「事前に決めておく方式」である点に注意が必要です。つまり、何文字ごとに分割するかというチャンクサイズを、コーディングを始める前に決めておかなければなりません。

次の例では、文字列「tutorixtutorixtutorix」を3文字ずつの部分文字列に分割しています。

コード例

<html>
<body>
<script>
   var v = [];
   var str = "tutorixtutorixtutorix"
   var t = str.split("");
   document.write(t);
   document.write("</br>");
   for (var i = 0; i< t.length; i++){
      if((i % 3) == 2){
         v.push(t[i-2].concat(t[i-1],t[i]));
      }
   }
   document.write(v);
</script>
</body>
</html>

実行結果

tut,ori,xtu,tor,ixt,uto,rix

2) 正規表現(Regex)を使った方法

正規表現を使った方法は、チャンクサイズを事前に固定する必要がありません。関数の引数として分割サイズを渡せるため、柔軟で再利用しやすい実装が可能です。

一般的に、任意の文字列から最大n文字の部分文字列を抽出したい場合は、次の構文を使用します。

str.match(/.{1,n}/g); // n を部分文字列のサイズに置き換えてください

文字列に改行(\n)や復帰(\r)が含まれる可能性がある場合は、次の構文を使用します。JavaScriptの正規表現では、ドット(.)は通常改行文字にマッチしないためです。

str.match(/(.|[\r\n]){1,n}/g); // n を部分文字列のサイズに置き換えてください

この構文を関数としてまとめると、次のようになります。

function chunkString(str, size) {
   return str.match(new RegExp('.{1,' + size + '}', 'g'));
}

コード例

<html>
<body>
<script>
   stringChop = function(str, size){
      if (str == null)
         return [];
      str = String(str);
      return size > 0 ? str.match(new RegExp('.{1,' + size + '}', 'g')) : [str];
   }
   document.write(stringChop('tutorialspoint'));
   document.write("<br>");
   document.write(stringChop('tutorix',2));
   document.write("<br>");
   document.write(stringChop('tutorialspoint',3));
</script>
</body>
</html>

実行結果

["tutorialspoint"]
["tu","to","ri","x"]
["tut","ori","als","poi","nt"]

どちらの方法を選ぶべきか?

チャンクサイズが固定で、シンプルな処理で済む場合は従来の方法でも問題ありません。しかし、サイズを実行時に指定したい場合や、コードを再利用したい場合には、正規表現を使って関数化した方法がおすすめです。また、上記のstringChop関数は、サイズに0以下の値を渡した場合は文字列全体をそのまま配列として返し、nullが渡された場合は空の配列を返すという、堅牢な作りになっている点もポイントです。

  1. JavaScriptで文字列を暗号化する方法|シーザー暗号のシフト実装

    JavaScriptでは、第1引数に文字列、第2引数に数値を受け取る関数を実装することで、簡単な文字列暗号化を行うことができます。この記事で紹介するのは、いわゆる「シーザー暗号」と呼ばれる古典的な暗号方式です。仕組みは非常にシンプルで、文字列に含まれる各アルファベットを、指定された数だけアルファベット順にずらすことで暗号文を生成します。重要なのは、シフトがアルファベットの末尾(z)を超えた場合には先頭(a)に戻り、逆に先頭より前になった場合には末尾(z)へ折り返されるという点です。これにより、「a」の前が「undefined」などの無効な値になることなく、常に正しい文字へと循環します。実装例以

  2. Pythonで区切り文字(str)を指定して文字列を分割する方法

    Pythonで文字列を特定の区切り文字で分割する方法は、主に2つあります。1つは文字列クラスの組み込みメソッド split() を使う方法、もう1つは正規表現モジュール re の re.split() を使う方法です。それぞれの使い方を詳しく見ていきましょう。 split()メソッドで文字列を分割する PythonのStringクラスには split() というメソッドが用意されており、区切り文字をオプション引数として指定できます。引数を省略した場合、デフォルトの区切り文字は空白(ホワイトスペース)になります。 >>> aa-ab-ca.split(-) [aa, ab, c