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

JavaScriptで文字列の大文字・小文字を反転させる方法

JavaScriptでは、文字列を受け取り、元の文字列に含まれる大文字をすべて小文字へ、小文字をすべて大文字へ変換した新しい文字列を生成する関数を実装する必要がある場面があります。

入力例と期待される出力

たとえば、次のような文字列が与えられたとします。

const str = 'The Case OF tHis StrinG Will Be FLiPped';

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

const output = 'tHE cASE of ThIS sTRINg wILL bE flIpPED';

実装例:文字コードを利用する方法

大文字と小文字のASCIIコードの差は32であることを利用すると、次のように実装できます。

const str = 'The Case OF tHis StrinG Will Be FLiPped';

// 大文字(A〜Z:65〜90)かどうかを判定
const isUpperCase = char => char.charCodeAt(0) >= 65 && char.charCodeAt(0) <= 90;

// 小文字(a〜z:97〜122)かどうかを判定
const isLowerCase = char => char.charCodeAt(0) >= 97 && char.charCodeAt(0) <= 122;

const flipCase = str => {
    let newStr = '';
    const margin = 32; // 大文字と小文字の文字コードの差
    for (let i = 0; i < str.length; i++) {
        const curr = str[i];
        if (isLowerCase(curr)) {
            newStr += String.fromCharCode(curr.charCodeAt(0) - margin);
        } else if (isUpperCase(curr)) {
            newStr += String.fromCharCode(curr.charCodeAt(0) + margin);
        } else {
            newStr += curr; // 英字以外はそのまま
        }
    }
    return newStr;
};

console.log(flipCase(str));

コードのポイント

  • isUpperCase / isLowerCasecharCodeAt()で取得した文字コードが、大文字(65〜90)または小文字(97〜122)の範囲内かどうかを判定します。
  • margin = 32:「A」(65)と「a」(97)のように、大文字と小文字のコード値はちょうど32異なるため、加減算だけで相互変換が可能です。
  • 英字以外の文字:数字や記号、空白などはそのまま結果の文字列に追加されます。

より簡潔な代替方法:toUpperCase() / toLowerCase() を使う

実際の開発では、標準メソッドを組み合わせることで、文字コードを意識せずにもっとシンプルに書けます。

const flipCase = str =>
  [...str]
    .map(c => c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase())
    .join('');

console.log(flipCase(str)); // tHE cASE of ThIS sTRINg wILL bE flIpPED

正規表現を使いたい場合は、replace()との組み合わせも有効です。

const flipCase = str =>
  str.replace(/[a-zA-Z]/g, c =>
    c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()
  );

注意点

charCodeAt()を使った方法はASCII英字のみを対象とするため、日本語などのマルチバイト文字やアクセント付きラテン文字は正しく変換されません。一方、toUpperCase() / toLowerCase()を使う方法はUnicodeに対応しているため、国際化を考慮したコードでは後者を選ぶのが安全です。

実行結果

いずれの方法でも、コンソールには次のように出力されます。

tHE cASE of ThIS sTRINg wILL bE flIpPED
  1. JavaScriptで文字列を真偽値(Boolean)に変換する方法

    JavaScriptでは、文字列が「true」というリテラルと一致するかどうかを比較演算子で判定することで、文字列を実質的に真偽値(Boolean)として扱うことができます。ここでは、==(緩い等価比較)と===(厳密等価比較)の2つの方法を使った具体例を紹介します。 サンプルコード <!DOCTYPE html> <html> <head> <style>     body {         font-family: &

  2. JavaScriptで文字列を圧縮する方法|ランレングス圧縮の実装

    本記事では、連続して繰り返される文字を含む可能性のある文字列を受け取り、それを圧縮して返すJavaScript関数の実装方法を解説します。 文字列圧縮のルール この関数は、連続する同じ文字を「1文字+連続回数」の形式に変換することで、文字列を圧縮します。 k4j 圧縮しても短くならない場合の扱い ただし、圧縮後の文字列の長さが元の文字列以上になってしまう場合は、圧縮を行わずに元の文字列をそのまま返す必要があります。 たとえば「aab」は「a2b1」と圧縮できますが、長さが3文字から4文字に増えてしまいます。このようなケースでは、関数は元の「aab」を返すように設計します。 サンプルコード 実