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

JavaScriptで単語を区切らずに文字列を固定長のブロックへ分割する方法

JavaScriptで、段落のテキストを含む文字列を第1引数に、チャンクサイズ(分割する長さ)を数値で第2引数に受け取る関数を作成する必要があります。

この関数には、次のような動作が求められます。

  • 文字列を、指定されたチャンクサイズ(第2引数)を超えない長さのかたまりに分割する
  • 分割は空白(スペース)または文末でのみ行い、単語の途中で切らない

具体例

たとえば、入力が次の場合を考えてみましょう。

const str = 'this is a string';
const chunkLength = 6;

このとき、期待される出力は次のとおりです。

const output = ['this', 'is a', 'string'];

6文字以内という制限のもと、「this」「is a」「string」という3つのチャンクに分割され、どの単語も途中で切断されていないことがわかります。

正規表現を使った実装方法

この問題を解くには、正規表現を使うのが効果的です。まず指定した文字数にマッチさせ、その後にバックトラック(後退マッチ)を行って、空白または文字列の終端が見つかるまでさかのぼります。これにより、単語の途中で分割されることを防げます。

コード例

実際のコードは次のようになります。

const size = 200;
const str = "This process was continued for several years for the deaf child does not here in a month or even in two or three years the numberless items and expressions using the simplest daily intercourse little hearing child learns from these constant rotation and imitation the conversation he hears in his home simulates is mine and suggest topics and called forth the spontaneous expression of his own thoughts.";

const splitString = (str = '', size) => {
  const regex = new RegExp(String.raw`\S.{1,${size - 2}}\S(?= |$)`, 'g');
  const chunks = str.match(regex);
  return chunks;
}

console.log(splitString(str, size));

出力結果

コンソールに出力される結果は次のとおりです。

[
  'This process was continued for several years for the deaf child does '
  + 'not here in a month or even in two or three years the numberless items and '
  + 'expressions using the simplest daily intercourse little',
  'hearing child learns from these constant rotation and imitation the '
  + 'conversation he hears in his home simulates is mine and suggest topics and '
  + 'called forth the spontaneous expression of his own',
  'thoughts.'
]

コードの解説

この正規表現のポイントを分解してみましょう。

  • \S:先頭と末尾が空白以外の文字であることを保証し、チャンクの前後に余計な空白が残るのを防ぎます。
  • .{1,${size - 2}}:改行以外の任意の文字を1文字以上、最大「チャンクサイズ − 2」文字までマッチさせます。両端に1文字ずつ\Sが必要なため、2文字分余裕を持たせています。
  • (?= |$):先読みアサーションにより、マッチの終わりが必ず空白または文字列の終端になるよう要求します。ここでバックトラックが働き、単語の途中ではなく適切な区切り位置まで自動的にさかのぼります。
  • フラグ 'g' を付けることで、文字列全体からすべてのチャンクを繰り返し抽出します。

このように、正規表現のバックトラックの仕組みを利用すれば、ループ処理を書かなくてもシンプルに「単語を壊さない固定長分割」を実現できます。文章をページ送り表示したり、テキストを一定幅で整形したりする場面で活用できるテクニックです。

  1. 【JavaScript】キャメルケースの文字列をスペース区切りで分割する方法

    問題キャメルケース(camelCase)で書かれた文字列 str を、第1引数(唯一の引数)として受け取るJavaScript関数を作成する必要があります。この関数は、入力された文字列の各単語の間に半角スペースを挿入して分割し、新しい文字列として構築して返すものとします。たとえば、関数への入力が次の場合を考えてみましょう。入力:const str = thisIsACamelCasedString;出力:const output = this Is A Camel Cased String;解決策:コード例以下がその実装コードです。const str = thisIsACamelCasedSt

  2. C++で文を単語ごとに分割する方法

    今回は、与えられた文を単語ごとに分割する方法を解説します。文中に含まれるすべての単語を取り出し、1行に1単語ずつ出力していきます。入力例と出力例入力I am a good boy出力I am a good boyこのように、元の文に含まれる各単語を1行ずつ出力するのが目標です。サンプルコード1#include <iostream> #include <string> using namespace std; void split(string st){ string word = ; for (char s : st){ if (s =