【JavaScript】文字列を英字・数字・特殊文字の3グループに分割する方法
本記事では、英字・数字・特殊文字が混在した文字列を受け取り、それぞれを別々の文字列へ振り分けるJavaScriptのプログラムを紹介します。
問題の概要
英字、数字、特殊文字で構成される文字列Sが与えられたとき、次の条件を満たす3つの文字列S1、S2、S3に分割するプログラムを作成します。
- S1:Sに含まれるすべての英字
- S2:Sに含まれるすべての数字
- S3:Sに含まれるすべての特殊文字
なお、各文字列内の文字は、元の入力文字列に出現した順序を維持する必要があります。
サンプルコード
以下がその実装例です。
const str = "Th!s String C0nt@1ns d1fferent ch@ract5rs";
const seperateCharacters = str => {
const strArr = str.split("");
return strArr.reduce((acc, val) => {
let { numbers, alpha, special } = acc;
if(+val){
numbers += val;
}else if(val.toUpperCase() !== val.toLowerCase()){
alpha += val;
}else{
special += val;
};
return { numbers, alpha, special };
}, {
numbers: '',
alpha: '',
special: ''
});
};
console.log(seperateCharacters(str));実行結果
コンソールには以下のように出力されます。
{
numbers: '115',
alpha: 'ThsStringCntnsdfferentchractrs',
special: '! 0@ @'
}コードの解説
処理の流れを簡単に整理すると、次のようになっています。
str.split(""):文字列を1文字ずつ要素に分解し、配列として扱えるようにします。reduce():配列の各文字を先頭から順に処理し、numbers(数字)、alpha(英字)、special(特殊文字)の3つのプロパティを持つオブジェクトへ振り分けながら蓄積していきます。+val:文字を数値に変換して真になるかどうかで、その文字が数字かどうかを判定します。val.toUpperCase() !== val.toLowerCase():大文字・小文字への変換によって値が変化するかどうかで、その文字が英字かどうかを判定します。- 上記のいずれにも該当しない文字は、スペースや記号などの特殊文字として分類されます。
注意点
実行結果を見ると、「0」が numbers ではなく special 側に含まれていることが分かります。これは +"0" の評価結果が数値の 0(falsyな値)となるためです。この手法を使う場合は、この挙動に注意が必要です。
-
【JavaScript】トランプのカードを連続する数字のグループに再配置できるか判定する方法
本記事では、JavaScriptを用いてトランプのカードを「指定サイズの連続した数字のグループ」に再配置できるかどうかを判定するアルゴリズムを解説します。配列のソートとハッシュマップ(オブジェクト)を組み合わせたシンプルかつ効率的なアプローチを学びましょう。 問題の概要 次のようなJavaScript関数を実装することが求められます。 第1引数:数値の配列 arr 第2引数:グループのサイズを表す数値 num 配列内の各数値は [1, 13] の範囲(両端を含む)に収まっており、それぞれトランプのカードに対応しています。 この関数の目的は、すべてのカードを「サイズが num であり、かつ
-
【Python】タプルをn個ずつのグループに分割する方法
Pythonでタプルを「n」個ずつのグループに分割したい場合、リスト内包表記を使うと非常に簡潔に実装できます。 まず前提として、タプルはイミュータブル(変更不可能)なデータ型です。一度定義した値は、インデックスを指定しても変更できず、変更を試みるとエラーが発生します。読み取り専用のアクセスが保証されるため、データの整合性を保ちたい場面で重要なデータ構造となっています。 リスト内包表記は、イテラブルなオブジェクトを反復処理しながら操作を行うための簡潔な記法です。これをスライスと組み合わせることで、タプルのグループ分割を数行で実現できます。 以下に具体的なサンプルコードを示します。 サンプルコード