JavaScriptで文字列内の文字を英字・数字・特殊文字に再グループ化する方法
問題
文字列 str を第一引数(唯一の引数)として受け取る JavaScript 関数を作成する必要があります。
この文字列には、次の3種類の文字が含まれる可能性があります。
- 英字:(A-Z)、(a-z)
- 数字:0〜9
- 特殊文字:上記以外のすべての文字
関数は文字列を先頭から順に走査し、ちょうど3つの要素からなる配列を構築します。1番目の要素には文字列に含まれるすべての英字、2番目には数字、3番目には特殊文字を格納し、それぞれ元の文字列内での出現順(相対的な順序)を維持します。最後にこの配列を返します。
例えば、関数への入力が次の場合を考えてみましょう。
入力
const str = 'thi!1s is S@me23';
出力
const output = [ 'thisisSme', '123', '! @' ];
解決策
以下がコードの実装例です。
const str = 'thi!1s is S@me23';
const regroupString = (str = '') => {
const res = ['', '', ''];
const alpha = 'abcdefghijklmnopqrstuvwxyz';
const numerals = '0123456789';
for(let i = 0; i < str.length; i++){
const el = str[i];
if(alpha.includes(el) || alpha.includes(el.toLowerCase())){
res[0] += el;
continue;
};
if(numerals.includes(el)){
res[1] += el;
continue;
};
res[2] += el;
};
return res;
};
console.log(regroupString(str));
出力
[ 'thisisSme', '123', '! @' ]
コードの解説
この実装の仕組みは次のとおりです。
- まず、3つの空文字列を持つ結果配列
resを初期化します。それぞれ英字・数字・特殊文字の格納先となります。 - 英字と数字の判定用に、アルファベット一覧
alphaと数字一覧numeralsを用意します。 forループで文字列を1文字ずつ取り出し、英字かどうかをincludes()で判定します。大文字も判定できるよう、小文字に変換した文字でも確認しています。- 英字でなければ数字かどうかを判定し、どちらにも該当しない文字は特殊文字として3番目の要素に追加します。
continueを使うことで、1文字につき必ず1つのグループにのみ分類されるようになっています。
正規表現を使った別解
より簡潔に書きたい場合は、正規表現と replace() を組み合わせる方法もあります。
const regroupString = (str = '') => {
const alpha = str.replace(/[^a-zA-Z]/g, '');
const numerals = str.replace(/[^0-9]/g, '');
const special = str.replace(/[a-zA-Z0-9]/g, '');
return [alpha, numerals, special];
};
console.log(regroupString('thi!1s is S@me23'));この方法では、該当しない文字をすべて削除することで各グループの文字列を抽出しています。replace() は元の文字列の順序を保持するため、出力結果は先ほどの実装と同じになります。文字列の長さが長い場合でも、正規表現による一括処理のほうがパフォーマンス面で有利になることが多いです。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptで文字列を出現頻度の高い順に並べ替える方法
問題 文字列を唯一の引数として受け取るJavaScript関数を作成します。 この関数は、元の文字列をもとに新しい文字列を生成し、出現回数が最も多い文字を先頭に配置し、以降は出現頻度の高い順(降順)に残りの文字を並べる必要があります。 たとえば、関数への入力が次の場合: const str = free; 出力は次のようになります。 const output = eefr; 出力の解説 eは2回出現するため先頭に配置され、その後に出現回数が1回ずつのfとrが続きます。 サンプルコード この問題を解くコードは以下の通りです。 const str = free; const frequency