JavaScriptで文字列の英数字のみを保持する|特殊文字をASCIIコードへ変換する方法
文字列を扱うプログラムでは、特殊文字を取り除いたり別の形式へ変換したりしたい場面がよくあります。
本記事では、特殊文字を含む可能性のある文字列を引数として受け取り、英数字と半角スペース以外のすべての文字を、それぞれに対応するASCIIコード(10進数)に置き換えた新しい文字列を返すJavaScript関数を紹介します。
実装コード
以下がその関数のコードです。
const str = 'Th!s !s @ str!ng th@t cont@!ns some special characters!!';
const specialToASCII = str => {
let res = '';
for(let i = 0; i < str.length; i++){
// 数字・アルファベット・半角スペースはそのまま残す
if(+str[i] || str[i].toLowerCase() !== str[i].toUpperCase() || str[i] === ' '){
res += str[i];
continue;
};
// その他の文字はASCIIコードに置き換える
res += str[i].charCodeAt(0);
};
return res;
};
console.log(specialToASCII(str));
出力結果
コンソールには以下のように出力されます。
Th33s 33s 64 str33ng th64t cont6433ns some special characters3333
コードの解説
この関数の仕組みを順番に見ていきましょう。
- +str[i]: 文字を数値に変換します。対象が数字の場合は変換結果が真となるため、元の文字がそのまま追加されます。
- str[i].toLowerCase() !== str[i].toUpperCase(): アルファベットは大文字と小文字で値が異なるため、この条件で英字かどうかを判定できます。
- str[i] === ' ': 半角スペースも許可するための条件です。
これらの条件のいずれにも当てはまらない文字(記号など)は、charCodeAt(0)メソッドによってASCIIコードへ変換されます。たとえば「!」は「33」、「@」は「64」に置き換わります。そのため、「Th!s」は「Th33s」という結果になります。
補足: 正規表現を使った代替案
より簡潔に実装したい場合は、正規表現を利用する方法もあります。
const specialToASCII = str =>
str.replace(/[^a-zA-Z0-9 ]/g, c => c.charCodeAt(0));
1文字ずつ判定するループ方式は処理の流れが明確で初心者にも理解しやすく、正規表現方式はコードが短く済むという利点があります。用途や可読性の要件に応じて使い分けるとよいでしょう。
-
JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法
JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え
-
JavaScriptで指定した文字数に文字列を切り詰める方法
JavaScriptでは、長いテキストを一覧表示やプレビュー用に短く表示したい場面がよくあります。この記事では、文字列と数値を受け取り、指定された文字数を超える場合は文字列を切り詰めて末尾に「...」を付けて返す関数の実装方法を解説します。要件作成する関数は、文字列と数値の2つの引数を受け取ります。文字列の長さが指定された数値より大きい場合は、先頭から指定文字数分だけ切り取った文字列に「...」を連結して返します。切り詰める必要がない場合(元の文字列が指定文字数以下の場合)は、元の文字列をそのまま返します。コード例以下がその実装コードです。 { const { length: len