JavaScript文字列操作 チートシート

cheatsheet

目的別のJavaScript文字列操作メソッド早見表

1. 文字・文字コードの取得 📌

文字列内の特定の位置にある文字やその文字コードを取得します。

メソッド 説明 構文例 戻り値 備考 ✨
charAt(index) 指定されたインデックス(位置)にある1文字を返します。
const str = 'こんにちは';
const char = str.charAt(2); // 'に'
指定位置の文字(文字列) インデックスが範囲外の場合は空文字列を返します。古いメソッドですが、広く使われています。絵文字などサロゲートペア文字は正しく扱えません。
charCodeAt(index) 指定されたインデックスにある文字のUTF-16コードユニット(0から65535の整数)を返します。
const str = 'ABC';
const code = str.charCodeAt(1); // 66 (Bのコード)
指定位置の文字のUTF-16コードユニット(数値) インデックスが範囲外の場合はNaNを返します。サロゲートペア文字の最初のコードユニットしか返しません。
codePointAt(index) 指定されたインデックスから始まる文字のUnicodeコードポイント(完全な値)を返します。
const emoji = '😄'; // サロゲートペア
const codePoint = emoji.codePointAt(0); // 128516
const char = String.fromCodePoint(codePoint); // '😄'

const str = 'ABC';
const codePointA = str.codePointAt(0); // 65
指定位置の文字のUnicodeコードポイント(数値) ES2015 (ES6) で追加。サロゲートペア(例: 一部の絵文字)を正しく扱えます。インデックスが範囲外の場合はundefinedを返します。
str[index] (プロパティアクセス) 指定されたインデックスにある1文字を返します。charAt() と似ていますが、挙動が少し異なります。
const str = 'いろは';
const char = str[1]; // 'ろ'
指定位置の文字(文字列) ECMAScript 5で標準化。インデックスが範囲外の場合はundefinedを返します(charAtは空文字列)。こちらもサロゲートペア文字は正しく扱えません。一般的にこちらの方が推奨されます。

2. 部分文字列の抽出 ✂️

文字列の一部を切り出して新しい文字列を取得します。

メソッド 説明 構文例 戻り値 備考 ✨
slice(beginIndex[, endIndex]) 文字列の一部を抽出して新しい文字列を返します。元の文字列は変更されません。
const str = 'JavaScript';
str.slice(0, 4); // 'Java'
str.slice(4);    // 'Script'
str.slice(-6);   // 'Script' (末尾から6文字)
str.slice(2, -2); // 'vaScri'
抽出された新しい文字列 beginIndex は含む、endIndex は含まない。
負のインデックスは文字列の末尾からの位置を示します。
最も汎用性が高く推奨される方法です。
MDN: slice()
substring(indexStart[, indexEnd]) 文字列の指定された部分集合を返します。
const str = 'Mozilla';
str.substring(1, 3); // 'oz'
str.substring(3, 1); // 'oz' (引数が逆でもOK)
str.substring(3);    // 'illa'
str.substring(3, -2); // 'Moz' (負の値は0として扱われる)
抽出された新しい文字列 indexStartindexEnd の大小関係は自動的に調整されます。
負の引数は 0 として扱われます。slice() との主な違いです。
MDN: substring()
substr(start[, length]) ⚠️ 文字列の指定した位置から指定した文字数分の文字列を返します。
const str = 'Web Browser';
str.substr(4, 7); // 'Browser' (4番目から7文字)
str.substr(4);    // 'Browser' (4番目から最後まで)
str.substr(-7);   // 'Browser' (末尾から7文字目以降)
抽出された新しい文字列 非推奨 (Deprecated) です。代わりに slice() または substring() を使用してください。
第1引数に負の値を指定すると末尾からの位置になります。
第2引数は抽出する「長さ」です。

3. 文字列の検索・判定 🔍

文字列内に特定の文字列やパターンが含まれているか検索したり、特定の位置から始まるかなどを判定します。

メソッド 説明 構文例 戻り値 備考 ✨
includes(searchString[, position]) 文字列内に指定された文字列が含まれているかどうかを判定します。
const str = '青い空と海';
str.includes('空'); // true
str.includes('山'); // false
str.includes('空', 3); // false (3番目以降に'空'はない)
含まれていれば true、そうでなければ false ES2015 (ES6) で追加。
大文字小文字を区別します。
第2引数で検索開始位置を指定できます。
indexOf(searchValue[, fromIndex]) 指定された文字列が最初に現れるインデックスを返します。見つからない場合は -1 を返します。
const str = 'パンケーキとパン';
str.indexOf('パン'); // 0
str.indexOf('パン', 1); // 6 (1番目以降で検索)
str.indexOf('ケーキ'); // 2
str.indexOf('ドーナツ'); // -1
最初に見つかったインデックス(数値)。見つからない場合は -1。 大文字小文字を区別します。
第2引数で検索開始位置を指定できます。
lastIndexOf(searchValue[, fromIndex]) 指定された文字列が最後に現れるインデックスを返します。逆方向(後方から前方)に検索します。見つからない場合は -1 を返します。
const str = 'パンケーキとパン';
str.lastIndexOf('パン'); // 6
str.lastIndexOf('パン', 5); // 0 (5番目以前で検索)
str.lastIndexOf('ケーキ'); // 2
str.lastIndexOf('ドーナツ'); // -1
最後に見つかったインデックス(数値)。見つからない場合は -1。 大文字小文字を区別します。
第2引数で検索終了位置(ここから手前に向かって検索)を指定できます。デフォルトは文字列の末尾。
startsWith(searchString[, position]) 文字列が指定された文字列で始まるかどうかを判定します。
const str = '今日の天気は晴れ';
str.startsWith('今日'); // true
str.startsWith('天気'); // false
str.startsWith('天気', 3); // true (3番目から始まるか)
始まっていれば true、そうでなければ false ES2015 (ES6) で追加。
大文字小文字を区別します。
第2引数で検索開始位置を指定できます。
endsWith(searchString[, length]) 文字列が指定された文字列で終わるかどうかを判定します。
const str = '今日の天気は晴れ';
str.endsWith('晴れ'); // true
str.endsWith('天気'); // false
str.endsWith('天気', 6); // true (最初の6文字が'天気'で終わるか)
終わっていれば true、そうでなければ false ES2015 (ES6) で追加。
大文字小文字を区別します。
第2引数で、文字列の最初の N 文字までを検索対象とします。デフォルトは文字列全体の長さ。
search(regexp) 正規表現に一致する最初の箇所のインデックスを返します。見つからない場合は -1 を返します。
const str = 'Apple Banana Orange';
str.search(/Banana/); // 6
str.search(/apple/i); // 0 (iフラグで大文字小文字無視)
str.search(/Grape/); // -1
str.search(/[A-Z]/); // 0 (最初の大文字)
最初に見つかったインデックス(数値)。見つからない場合は -1。 引数には正規表現オブジェクトまたは正規表現リテラルを指定します。文字列を渡すと正規表現に変換されます。
indexOf()と似ていますが、正規表現が使えます。
検索開始位置は指定できません。
match(regexp) 正規表現にマッチした結果を配列で返します。マッチしない場合は null を返します。
const str = 'Neko neko Nyanko';
str.match(/neko/);
// ['neko', index: 5, input: 'Neko neko Nyanko', groups: undefined]

str.match(/neko/i); // gフラグなし: 最初の一致のみ
// ['Neko', index: 0, input: 'Neko neko Nyanko', groups: undefined]

str.match(/neko/ig); // gフラグあり: 全ての一致
// ['Neko', 'neko']

str.match(/inu/); // null
マッチ結果の配列、または null 正規表現に g フラグがない場合、最初の一致に関する詳細情報(インデックス、入力文字列など)を含む配列を返します。
正規表現に g フラグがある場合、すべての一致した部分文字列のみを含む配列を返します。
MDN: match()
matchAll(regexp) 正規表現にマッチしたすべての結果を、詳細情報(インデックス、キャプチャグループ等)を含めて反復可能なイテレーターとして返します。
const str = 'Test1 Test2 Test3';
const regexp = /Test(\d)/g; // gフラグ必須
const matches = str.matchAll(regexp);

for (const match of matches) {
  console.log(match);
}
// ['Test1', '1', index: 0, ...]
// ['Test2', '2', index: 6, ...]
// ['Test3', '3', index: 12, ...]
マッチ結果のイテレーター ES2020 で追加。
正規表現には g フラグが必須です。必須でない場合、TypeErrorが発生します。
match()g フラグ付きの場合よりも詳細な情報(キャプチャグループなど)をすべて取得できます。

4. 文字列の置換 🔁

文字列内の一部を別の文字列や正規表現にマッチした部分で置換します。

メソッド 説明 構文例 戻り値 備考 ✨
replace(searchValue, newValue) 指定された文字列または正規表現に最初に一致した部分を、指定された文字列または関数の戻り値で置換した新しい文字列を返します。
const str = 'リンゴとバナナ、そしてリンゴ';

// 文字列で置換 (最初のみ)
str.replace('リンゴ', 'オレンジ');
// 'オレンジとバナナ、そしてリンゴ'

// 正規表現で置換 (最初のみ)
str.replace(/リンゴ/, 'オレンジ');
// 'オレンジとバナナ、そしてリンゴ'

// 正規表現とgフラグで全て置換
str.replace(/リンゴ/g, 'オレンジ');
// 'オレンジとバナナ、そしてオレンジ'

// 関数で置換
str.replace(/リンゴ/g, (match) => match.toUpperCase());
// 'リンゴとバナナ、そしてリンゴ' (例: 大文字化)
置換後の新しい文字列 元の文字列は変更されません。
第一引数に文字列を指定した場合、最初に一致したものだけが置換されます。
すべて置換するには、第一引数にgフラグ付きの正規表現を使うか、replaceAll() を使用します。
第二引数には置換文字列の他に、置換処理を行う関数を指定できます。関数の引数にはマッチした文字列などが渡されます。
置換文字列内で特殊なパターン ($`, $&, $', $n, $$) を使用できます。
MDN: replace()
replaceAll(searchValue, newValue) 指定された文字列または正規表現に一致したすべての部分を、指定された文字列または関数の戻り値で置換した新しい文字列を返します。
const str = 'abc abc abc';

// 文字列で全て置換
str.replaceAll('abc', 'xyz');
// 'xyz xyz xyz'

// 正規表現で全て置換 (gフラグ必須)
str.replaceAll(/abc/g, 'xyz');
// 'xyz xyz xyz'

// str.replaceAll(/abc/, 'xyz'); // エラー (gフラグがない)

// 関数で全て置換
str.replaceAll('abc', (match) => match.toUpperCase());
// 'ABC ABC ABC'
置換後の新しい文字列 ES2021 で追加。
元の文字列は変更されません。
第一引数に正規表現を指定する場合、gフラグが必須です。ない場合は TypeError が発生します。
第一引数に文字列を指定した場合でも、すべての一致箇所が置換されます。これが replace() との大きな違いです。
第二引数の関数や特殊な置換パターンは replace() と同様に使えます。
MDN: replaceAll()

5. 文字列の分割と結合 🔗

文字列を特定の区切り文字で分割して配列にしたり、配列の要素を結合して文字列にします。

メソッド 説明 構文例 戻り値 備考 ✨
split([separator[, limit]]) 文字列を指定された区切り文字列(または正規表現)で分割し、部分文字列の配列を返します。
const str = 'apple,banana,orange';
str.split(','); // ['apple', 'banana', 'orange']

const words = 'Hello World';
words.split(' '); // ['Hello', 'World']

const chars = 'abc';
chars.split(''); // ['a', 'b', 'c']

const csv = 'one,two,three,four';
csv.split(',', 2); // ['one', 'two'] (limit=2)

'A|B| C'.split(/\|\s*/); // ['A', 'B', 'C'] (正規表現)
部分文字列を含む新しい配列 separator を省略するか undefined の場合、元の文字列全体を唯一の要素とする配列を返します。
separator が空文字列 '' の場合、文字列は UTF-16 コードユニットごとに分割されます(サロゲートペアに注意)。
limit は、返される配列の最大要素数を指定する非負の整数です。
MDN: split()
Array.prototype.join([separator]) (参考) 配列の全要素を順に連結した新しい文字列を返します。文字列操作とセットでよく使われます。
const arr = ['apple', 'banana', 'orange'];
arr.join(); // 'apple,banana,orange' (デフォルトはカンマ)
arr.join(''); // 'applebananaorange'
arr.join(' / '); // 'apple / banana / orange'

['a','b','c'].join(''); // 'abc' (split('')の逆操作)
連結された新しい文字列 これは String のメソッドではなく Array のメソッドですが、split() の逆操作として重要です。
separator を省略した場合、要素はカンマで区切られます。
空の配列に対して呼び出すと空文字列を返します。

6. 大文字・小文字変換 🔄

文字列全体のアルファベットを大文字または小文字に変換します。

メソッド 説明 構文例 戻り値 備考 ✨
toLowerCase() 文字列を小文字に変換した新しい文字列を返します。
const str = 'Hello World!';
str.toLowerCase(); // 'hello world!'
小文字に変換された新しい文字列 元の文字列は変更されません。ロケール(言語環境)に依存しない変換を行います。
toUpperCase() 文字列を大文字に変換した新しい文字列を返します。
const str = 'Hello World!';
str.toUpperCase(); // 'HELLO WORLD!'
大文字に変換された新しい文字列 元の文字列は変更されません。ロケール(言語環境)に依存しない変換を行います。
toLocaleLowerCase([locale]) ホスト環境の現在のロケールに基づいて、文字列を小文字に変換した新しい文字列を返します。
const str = 'İstanbul'; // トルコ語の I
// ロケール指定なし (環境依存)
str.toLocaleLowerCase();

// トルコ語ロケール指定
str.toLocaleLowerCase('tr-TR'); // 'istanbul' (ドット付きの i)
ロケールに基づいて小文字に変換された新しい文字列 特定の言語(例: トルコ語)では、toLowerCase() と結果が異なる場合があります。
引数で特定のロケールを指定できます。
toLocaleUpperCase([locale]) ホスト環境の現在のロケールに基づいて、文字列を大文字に変換した新しい文字列を返します。
const str = 'istanbul'; // トルコ語の i
// ロケール指定なし (環境依存)
str.toLocaleUpperCase();

// トルコ語ロケール指定
str.toLocaleUpperCase('tr-TR'); // 'İSTANBUL' (ドット付きの İ)
ロケールに基づいて大文字に変換された新しい文字列 特定の言語(例: トルコ語)では、toUpperCase() と結果が異なる場合があります。
引数で特定のロケールを指定できます。

7. 空白の除去 🧹

文字列の先頭、末尾、またはその両方から空白文字(スペース、タブ、改行など)を除去します。

メソッド 説明 構文例 戻り値 備考 ✨
trim() 文字列の両端から空白文字を除去した新しい文字列を返します。
const str = '   Hello World!   ';
str.trim(); // 'Hello World!'
両端の空白が除去された新しい文字列 ECMAScript 5 で標準化。最も一般的に使用されます。
空白文字には、スペース、タブ、ノーブレークスペース、改行コードなどが含まれます。
trimStart() / trimLeft() 文字列の先頭(左端)から空白文字を除去した新しい文字列を返します。
const str = '   Hello World!   ';
str.trimStart(); // 'Hello World!   '
先頭の空白が除去された新しい文字列 ES2019 で標準化。
trimLeft() はエイリアス(別名)ですが、標準は trimStart() です。互換性のために両方存在します。
trimEnd() / trimRight() 文字列の末尾(右端)から空白文字を除去した新しい文字列を返します。
const str = '   Hello World!   ';
str.trimEnd(); // '   Hello World!'
末尾の空白が除去された新しい文字列 ES2019 で標準化。
trimRight() はエイリアス(別名)ですが、標準は trimEnd() です。互換性のために両方存在します。

8. 文字列のパディング(詰め物)📏

文字列が指定された長さになるように、先頭または末尾に指定された文字(または文字列)を詰めます。

メソッド 説明 構文例 戻り値 備考 ✨
padStart(targetLength[, padString]) 現在の文字列が指定された長さ (targetLength) になるまで、先頭(左側)に指定された文字列 (padString) を繰り返し追加します。
const str = '5';
str.padStart(3, '0'); // '005'

const id = 'abc';
id.padStart(5); // '  abc' (デフォルトはスペース)
id.padStart(5, 'x'); // 'xxabc'

'12345'.padStart(3, '0'); // '12345' (既に長い場合はそのまま)
指定された長さになるようにパディングされた新しい文字列 ES2017 (ES8) で追加。
元の文字列が targetLength 以上の場合は、そのまま返されます。
padString を省略した場合、デフォルトでスペースが使用されます。
padString が複数文字の場合、targetLength を超えないように必要な部分だけが使用されます。
padEnd(targetLength[, padString]) 現在の文字列が指定された長さ (targetLength) になるまで、末尾(右側)に指定された文字列 (padString) を繰り返し追加します。
const str = 'abc';
str.padEnd(5, '.'); // 'abc..'

const price = '100';
price.padEnd(6, ' yen'); // '100 ye' (必要な部分だけ)
price.padEnd(5); // '100  ' (デフォルトはスペース)
指定された長さになるようにパディングされた新しい文字列 ES2017 (ES8) で追加。
基本的なルールは padStart() と同じですが、パディングが末尾に行われます。

9. 文字列の比較と結合 🤝

文字列同士を比較したり、連結(結合)したりします。

メソッド/演算子 説明 構文例 戻り値 備考 ✨
localeCompare(compareString[, locales[, options]]) 参照となる文字列 (this) が、指定された文字列 (compareString) に対して、ソート順において前に来るか、後に来るか、同じかを示す数値を返します。
'a'.localeCompare('b'); // -1 or -2 (aはbより前)
'b'.localeCompare('a'); // 1 or 2 (bはaより後)
'a'.localeCompare('a'); // 0 (同じ)

// ドイツ語での比較 (ウムラウトの扱い)
'ä'.localeCompare('z', 'de'); // -1 (äはzより前)

// 大文字小文字を無視して比較
'A'.localeCompare('a', 'en', { sensitivity: 'base' }); // 0
負の数、0、正の数のいずれか ロケール(言語)固有のソート順に基づいて比較します。単純な文字コード順ではありません。
オプションで大文字小文字の区別、数値としての比較などを指定できます。
配列のソート (sort()) と組み合わせて使うことが多いです。
MDN: localeCompare()
concat(string2[, ...stringN]) 引数として与えられた1つ以上の文字列を結合し、新しい文字列を返します。
const str1 = 'Hello';
const str2 = ' ';
const str3 = 'World!';
str1.concat(str2, str3); // 'Hello World!'

'A'.concat('B', 'C'); // 'ABC'
結合された新しい文字列 元の文字列は変更されません。
プラス演算子 (+) を使った文字列結合の方が一般的にパフォーマンスが良いとされ、コードも短くなるため、concat() の使用頻度は低いです。
+ 演算子 文字列結合演算子。2つのオペランド(文字列または文字列に変換可能な値)を結合します。
const str1 = 'Java';
const str2 = 'Script';
const combined = str1 + str2; // 'JavaScript'

const name = 'User';
const score = 100;
const message = 'Name: ' + name + ', Score: ' + score;
// 'Name: User, Score: 100'
結合された新しい文字列 最も一般的な文字列結合の方法です。
オペランドのいずれかが文字列でない場合、文字列に変換されてから結合されます。(例: 数値、ブール値)
テンプレートリテラル バッククォート (`) で囲み、${expression} 形式で式を埋め込める文字列リテラル。
const name = 'Alice';
const age = 30;

const greeting = `こんにちは、${name}さん。
あなたは ${age} 歳ですね。`;
/*
こんにちは、Aliceさん。
あなたは 30 歳ですね。
*/

const a = 5;
const b = 10;
const sumMsg = `合計は ${a + b} です。`; // 合計は 15 です。
式が評価・埋め込みされた文字列 ES2015 (ES6) で導入。
複数行の文字列を簡単に作成できます。
文字列内に変数を埋め込む (String Interpolation) のに非常に便利で、+ 演算子よりも可読性が高い場合が多いです。
タグ付きテンプレートという高度な機能もあります。

10. その他の便利なメソッド ✨

その他の便利な文字列操作メソッドです。

メソッド 説明 構文例 戻り値 備考 ✨
repeat(count) 文字列を指定された回数だけ繰り返して連結した新しい文字列を返します。
'abc'.repeat(3); // 'abcabcabc'
'テスト'.repeat(2); // 'テストテスト'
'hoge'.repeat(0); // ''
' '.repeat(5); // '     '
繰り返された新しい文字列 ES2015 (ES6) で追加。
count は 0 以上の整数である必要があります。負の数や Infinity を指定すると RangeError が発生します。
count が 0 の場合は空文字列を返します。
normalize([form]) 文字列の Unicode 正規化形式 (Normalization Form) を返します。
const name1 = '\u0041\u030A'; // A + リング (合成文字)
const name2 = '\u00C5'; // Å (合成済み文字)

name1 === name2; // false
name1.normalize('NFC') === name2; // true (NFC: 合成)
name1.normalize('NFD') === name1; // true (NFD: 分解)
name2.normalize('NFD') === name1; // true
指定された Unicode 正規化形式の新しい文字列 文字によっては、視覚的に同じでも内部的な表現(コードポイントの並び)が異なる場合があります(例:「が」と「か」+「゛」)。
normalize() はこれらの表現を統一するために使います。
引数 form には ‘NFC’ (デフォルト), ‘NFD’, ‘NFKC’, ‘NFKD’ のいずれかを指定します。
toString() String オブジェクトの値を表す文字列を返します。
const strObj = new String('Hello');
strObj.toString(); // 'Hello'

const primitiveStr = 'World';
primitiveStr.toString(); // 'World' (プリミティブでも呼べる)
元の文字列(プリミティブ値) 通常、文字列リテラル(プリミティブ)に対して明示的に呼び出す必要はありませんが、String オブジェクトからプリミティブな文字列値を取得する際に使われます。
多くのオブジェクトが持つ基本的なメソッドです。
valueOf() String オブジェクトのプリミティブ値を返します。
const strObj = new String('Test');
strObj.valueOf(); // 'Test'

const primitiveStr = 'Example';
primitiveStr.valueOf(); // 'Example'
元の文字列(プリミティブ値) toString() とほぼ同じ目的で使われますが、オブジェクトのプリミティブ値が必要な場面で内部的に呼び出されることがあります。
注意点: JavaScriptの文字列は **イミュータブル (immutable)** です。つまり、一度作成された文字列の内容を直接変更することはできません。上記で紹介したメソッドの多くは、操作結果として **新しい文字列を返す** ものであり、元の文字列自体を変更するものではありません。
let myString = "hello";
myString.toUpperCase(); // 新しい文字列 "HELLO" を返すが、myString は変わらない
console.log(myString); // "hello"

myString = myString.toUpperCase(); // 返された新しい文字列で変数を上書きする
console.log(myString); // "HELLO"

コメント

タイトルとURLをコピーしました