【2026年7月最新】JavaScript substr・substring・slice 文字列切り出し完全ガイド|非推奨から移行法・実務例・Claude Code活用まで

【2026年7月最新】JavaScript substr・substring・slice 文字列切り出し完全ガイド|非推奨から移行法・実務例・Claude Code活用まで

JavaScriptで文字列を切り出す方法を調べると「substr・substring・slice」の3つが出てきます。これらの違いが分からなくて、とりあえず動いた方法を使い続けている方も多いのではないでしょうか。

実はsubstr()は現在非推奨(deprecated)であり、将来的に削除される可能性があります。にもかかわらず、多くの解説記事がいまだに非推奨の substr を中心に解説しているのが現状です。今後はslice()かsubstring()を使うのが正しい選択であり、この記事ではその理由と使い方を徹底的に解説します。

代表菅澤 代表菅澤
「substrを教えてもらってコードに使ってしまった」という方も大丈夫です。既存コードを slice に移行するための具体的な書き換えパターンも紹介するので、既存プロジェクトの対応にも使えます。
AI鬼管理山崎 AI鬼管理山崎
slice・substring・substrは見た目が似ていますが、引数の意味と負のインデックスの扱いがまったく異なります。特に「マイナスを指定したら挙動が変わった」という経験がある方は、Section5の比較表を先に見ることをおすすめします。
✔️substr・substring・sliceの引数の意味の違い(文字数指定 vs 終了インデックス)
✔️substr()が非推奨になった理由と、今後の移行先
✔️3メソッドで負のインデックスの挙動が異なる点と対処法
✔️日本語・絵文字(Unicode)を正しく切り出す方法
✔️URL解析・テキスト切り捨てなど実務ユースケースのテンプレートコード
✔️Claude Codeで文字列処理コードを自動生成させる方法
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】JavaScript substr・substring・slice 文字列切り出し完全ガイド|非推奨から移行法・実務例・Claude Code活用まで
JavaScriptのsubstr(非推奨)・substring・sliceの違いを完全解説。引数の挙動・負のインデックス差・Unicode/絵文字の注意点・URL解析・テキスト切り捨てなど実務ユースケース・Claude Code活用まで網羅。

01 substr・substring・sliceの違いを先に把握する 3つの引数構造と推奨度の比較

まず3メソッドの構文を並べて確認します。この違いを最初に押さえておくことで、後の詳細説明が理解しやすくなります。

// 3つのメソッドの構文比較
const str = "Hello World";

// ① substring(開始インデックス, 終了インデックス) ← 推奨
str.substring(0, 5)  // → "Hello"   (0番目から5番目の直前まで)

// ② slice(開始インデックス, 終了インデックス) ← 推奨(負のインデックス可)
str.slice(0, 5)      // → "Hello"   (substrとほぼ同じ動作)
str.slice(-5)        // → "World"   (末尾から5文字)

// ③ substr(開始インデックス, 文字数) ← 非推奨!
str.substr(0, 5)     // → "Hello"   (0番目から5文字分)
メソッド第1引数第2引数負のインデックス推奨度
substring()開始インデックス終了インデックス(含まない)0として扱う(注意)◎ 推奨
slice()開始インデックス終了インデックス(含まない)末尾からのオフセット(直感的)◎ 推奨
substr()開始インデックス切り出す文字数負のインデックス可(一部)× 非推奨(deprecated)

📚 用語解説

インデックス(Index):文字列の各文字の位置番号。JavaScriptでは0から始まる。"Hello"の場合、H=0、e=1、l=2、l=3、o=4。終了インデックスを指定する場合、その位置の文字は含まれない("Hello".slice(0,3) → "Hel"、3番目のlは含まれない)。

💡 迷ったらslice()を使う

3つのうちどれを使えばいいか迷う場面では、slice()を選べば間違いありません。substrと同じく開始位置からの指定が直感的で、かつ負のインデックスも自然に使え、非推奨でもない。substring()は引数の順序が逆転するエッジケースがあるため、シンプルに使うならsliceの方が安全です。

02 substr()の使い方(非推奨)とdeprecation理由 既存コードの理解のために知っておく。新規はslice()に移行する

⚠️ substr()は非推奨(deprecated)です

MDN Web Docsでは substr() は「Web標準から削除される予定(deprecated)」と明記されています。古いコードの読解には役立ちますが、新規コードでsubstr()を書くことは推奨しません。slice() または substring() を使いましょう。

substr()の構文は str.substr(start, length) です。第2引数が「終了インデックス」ではなく「切り出す文字数」である点がsubstringやsliceとの最大の違いです。

const str = "Hello World";
//            01234567890  ← インデックス

// 基本: substr(開始インデックス, 文字数)
str.substr(0, 5)   // → "Hello"    (0番目から5文字)
str.substr(6, 5)   // → "World"    (6番目から5文字)
str.substr(6)      // → "World"    (第2引数省略=末尾まで)

// 負の開始インデックス(末尾からのオフセット)
str.substr(-5)     // → "World"    (末尾から5文字)
str.substr(-5, 3)  // → "Wor"      (末尾から5文字目を起点に3文字)

// 第2引数が0または負数の場合
str.substr(0, 0)   // → ""         (空文字列)
str.substr(0, -1)  // → ""         (負数の文字数は空文字列)

substr()がdeprecatedになった理由

substr()が非推奨になった理由は主に2点です。①他の言語と引数の意味が異なるため混乱を招く(多くの言語では「開始位置, 終了位置」が標準的)。②substringとsliceで同等の機能が提供されており、substr固有の利点がほぼないため。ECMAScript仕様でも「Annex B(旧形式の機能)」に分類されており、将来のブラウザやNode.jsで削除される可能性があります。

// substrからsliceへの移行パターン
// substr(start, length) → slice(start, start + length)

// Before (非推奨)
str.substr(3, 5)

// After (推奨)
str.slice(3, 3 + 5)  // = str.slice(3, 8)

// 第2引数なし(末尾まで)の場合
str.substr(3)       // Before
str.slice(3)        // After(同じ書き方でOK)

// 負の開始インデックスの場合
str.substr(-5)      // Before
str.slice(-5)       // After(同じ書き方でOK)

03 substring()の使い方と負のインデックスの落とし穴 substrと混同しやすい第2引数の意味と特殊挙動

substring()の構文は str.substring(start, end) です。第2引数は「文字数」ではなく「終了インデックス(その位置の文字を含まない)」です。

const str = "Hello World";
//            01234567890

// 基本: substring(開始インデックス, 終了インデックス)
str.substring(0, 5)    // → "Hello"    (0〜4番目まで、5番目を含まない)
str.substring(6, 11)   // → "World"    (6〜10番目まで)
str.substring(6)       // → "World"    (第2引数省略=末尾まで)

// ★ 特殊挙動①: 引数が逆転した場合は自動的にスワップ
str.substring(5, 0)    // → "Hello"    (substringは(0,5)として処理する)

// ★ 特殊挙動②: 負のインデックスは 0 として扱われる
str.substring(-3, 5)   // → "Hello"    (-3は0として扱われ、(0,5)と同じ)
str.substring(3, -1)   // → "Hel"      (-1は0扱い、(0,3)にスワップ)
⚠️ substringの負のインデックスは0として扱われる!

substring()では、負のインデックスをそのまま「末尾からのオフセット」として使うことができません。-5を渡しても末尾から5文字前ではなく、0(先頭)として扱われます。末尾からの相対位置で切り出したい場合は slice() を使いましょう。

操作substring()slice()(参考)
末尾から5文字substring(str.length - 5)(長さから計算が必要)slice(-5)(直感的)
引数が逆転したとき自動スワップして処理(エラーにならない)空文字列を返す
負のインデックス0として扱う末尾からのオフセットとして扱う

📚 用語解説

substring()の引数スワップ仕様:str.substring(start, end) で start > end の場合(例: substring(8, 3))、JavaScriptは自動的に引数を入れ替えてsubstring(3, 8)として処理する。エラーは発生しないが、意図しない結果になることがある。sliceは同じ状況で空文字列を返す。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 slice()の使い方|負のインデックスが最も直感的 3メソッドの中で最も柔軟で推奨されるslice()の完全解説

slice()の構文は str.slice(start, end) です。substringと同じく第2引数は終了インデックスですが、負のインデックスを「末尾からのオフセット」として正しく扱う点が最大の違いです。

const str = "Hello World";
//            01234567890   (正のインデックス)
//          -11-10-9-8-7-6-5-4-3-2-1  (負のインデックス)

// 基本: slice(開始インデックス, 終了インデックス)
str.slice(0, 5)     // → "Hello"    (0〜4番目まで)
str.slice(6, 11)    // → "World"    (6〜10番目まで)
str.slice(6)        // → "World"    (第2引数省略=末尾まで)

// 負の開始インデックス(末尾からのオフセット)
str.slice(-5)       // → "World"    (末尾から5文字)
str.slice(-5, -2)   // → "Wor"      (末尾から5文字目〜末尾から2文字目の直前)
str.slice(-5, 9)    // → "Wo"       (負と正のインデックスを混在させることも可能)

// 開始 > 終了の場合(substrとは異なり空文字列を返す)
str.slice(5, 0)     // → ""         (スワップされない、空文字列)
str.slice(-1, -5)   // → ""         (終了が開始より前、空文字列)
💡 slice()は配列にも同じシグネチャで使える

JavaScriptのArray.prototype.slice()もString.prototype.slice()と全く同じシグネチャ(引数の構造)を持ちます。文字列のsliceを覚えれば配列のsliceも同じ感覚で使えるため、一度理解すれば応用範囲が広いです。

str.slice(0, 5)
"Hello"
(正→正)
str.slice(-5)
"World"
(負→末尾)
str.slice(-5, -2)
"Wor"
(負→負)
str.slice(3, -1)
"lo Worl"
(正→負混在)

05 3メソッドの引数・挙動を完全比較 同じ結果を得るコードと、挙動が変わるエッジケース

3つのメソッドは通常ケースでは似たような結果を返しますが、引数が特殊な場合(負の値・引数の順序逆転・省略等)で動作が異なります

const str = "Hello World";  // length = 11

// ===== 基本ケース(ほぼ同じ結果)=====
str.substring(0, 5)   // "Hello"
str.slice(0, 5)        // "Hello"
str.substr(0, 5)       // "Hello"(非推奨)

// ===== 第2引数省略(末尾まで)=====
str.substring(6)       // "World"
str.slice(6)           // "World"
str.substr(6)          // "World"(非推奨)

// ===== 負の開始インデックス =====
str.slice(-5)          // "World"   ← 末尾から5文字
str.substring(-5)      // "Hello World" ← -5を0として扱う(全体)
str.substr(-5)         // "World"   ← substrは負のstart対応(非推奨)

// ===== 開始インデックス > 終了インデックス =====
str.slice(8, 3)        // ""        ← 空文字列
str.substring(8, 3)    // "lo Wo"  ← 自動スワップ(substring(3,8)と同じ)

// ===== 引数がundefined =====
str.slice(undefined, 5)    // "Hello"   ← undefinedは0として扱う
str.substring(undefined, 5)// "Hello"   ← undefinedは0として扱う

// ===== 文字列長を超えたインデックス =====
str.slice(0, 100)      // "Hello World"  ← 末尾まで(エラーにならない)
str.substring(0, 100)  // "Hello World"  ← 末尾まで(エラーにならない)
str.substr(0, 100)     // "Hello World"  ← 末尾まで(非推奨)
ケースsubstring()slice()substr()
str.xxx(0, 5)"Hello""Hello""Hello"(文字数5)
str.xxx(-5)"Hello World"(-5→0扱い)"World"(末尾5文字)"World"(末尾5文字)
str.xxx(8, 3)"lo Wo"(自動スワップ)""(空文字)"lo Wo"(文字数-5→0)
str.xxx(3)"lo World""lo World""lo World"
今後の使用◎ 推奨◎ 推奨× 非推奨(deprecated)
代表菅澤 代表菅澤
この比較表で最も重要なのは「負のインデックス」の行です。slice(-5)は"World"、substring(-5)は"Hello World"(全体)と結果が全く違います。これを知らずにsliceとsubstringを混在させると、-5を渡した瞬間に全く違う結果になって混乱します。

06 日本語・Unicode・絵文字を正しく扱う方法 サロゲートペアの問題とat()・スプレッド演算子での対処

substring()・slice()・substr()はすべてJavaScript内部のUTF-16コードユニット単位で動作します。日本語のひらがな・漢字はUTF-16で1コードユニット(1文字=1インデックス)ですが、絵文字(emoji)や一部の漢字(𠮷など)はUTF-16で2コードユニット(サロゲートペア)を使うため、sliceで切り出すと文字が壊れることがあります。

📚 用語解説

サロゲートペア(Surrogate Pair):Unicode文字のうち、U+10000以上の文字(絵文字・特殊記号・一部漢字)をJavaScriptの内部表現UTF-16で格納する際に2つのコードユニットを組み合わせて1文字を表す方式。javascriptの.lengthや通常のslice/substring/substrはコードユニット単位で数えるため、サロゲートペア文字は「1文字」ではなく「2」と数えられてしまう。

// 通常の日本語は問題なし(ひらがな・漢字はBMP内)
const jp = "こんにちは";
jp.length          // 5(正しい)
jp.slice(0, 3)     // "こんに"(正しい)

// 絵文字はサロゲートペア(2コードユニット = 長さ2として扱われる)
const emoji = "Hello😀World";
emoji.length       // 13("😀"が2としてカウントされるため12ではなく13)
emoji.slice(5, 6)  // ""(壊れた文字!絵文字の前半だけ)
emoji.slice(5, 7)  // "😀"(2つ取れば正しく取得できる)

// 𠮷(U+20BB7 / 吉の旧字)もサロゲートペア
const special = "𠮷野家";
special.length     // 4("𠮷"が2文字分にカウント)
special.slice(0, 2) // "𠮷"(2コードユニット取ると正しい)
special.slice(0, 1) // ""(壊れる)

// 正しく1文字ずつ扱う方法
// ① スプレッド演算子で配列化(サロゲートペアを正しく1文字として扱う)
[...emoji].length  // 12(絵文字を1文字としてカウント)
[...emoji].slice(5, 6).join('')  // "😀"(正しく取得)

// ② Array.from()も同じ
Array.from(emoji).length  // 12
Array.from(emoji).slice(5, 6).join('')  // "😀"

// ③ String.prototype.at()は正のインデックスのみ(サロゲートペアは非対応)
emoji.at(5)   // ""(at()もコードユニット単位なので壊れる)

// ④ Intl.Segmenter(最新のAPIで書記素クラスタ単位に分割)
const segmenter = new Intl.Segmenter('ja', { granularity: 'grapheme' });
const segments = [...segmenter.segment(emoji)].map(s => s.segment);
segments.length       // 12
segments.slice(5, 6)  // ["😀"]
💡 日本語ひらがな・漢字は通常のsliceで問題なし

日常的によく使う日本語(ひらがな・カタカナ・一般的な漢字)は Unicode BMP(U+0000〜U+FFFF)内に収まるため、1文字 = 1コードユニットです。通常のslice()・substring()で正しく動作します。サロゲートペアの問題が起きるのは、主に絵文字・特殊記号・一部の稀な漢字を含む文字列を処理するときです。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 実務ユースケース別テンプレートコード集 URL解析・ファイル拡張子・テキスト切り捨てなど

7-1. ファイル名から拡張子を取得する

// ファイル名から拡張子を取得(例: "photo.jpg" → ".jpg")
function getExtension(filename) {
    const dotIndex = filename.lastIndexOf('.');
    if (dotIndex === -1) return '';  // ドットがなければ拡張子なし
    return filename.slice(dotIndex);  // ドット含む拡張子
}

getExtension('photo.jpg')       // → ".jpg"
getExtension('archive.tar.gz')  // → ".gz"(最後のドット以降)
getExtension('README')          // → ""(拡張子なし)

// 拡張子なしのファイル名部分だけ取得
function getBaseName(filename) {
    const dotIndex = filename.lastIndexOf('.');
    if (dotIndex === -1) return filename;
    return filename.slice(0, dotIndex);
}

getBaseName('photo.jpg')  // → "photo"
getBaseName('archive.tar.gz')  // → "archive.tar"

7-2. URLからパス・クエリパラメータを取り出す

// URLからホスト名以降のパスを取り出す
function getPathFromUrl(url) {
    // "https://example.com/path/to/page?q=test" → "/path/to/page?q=test"
    const protocolEnd = url.indexOf('://');
    if (protocolEnd === -1) return url;

    const hostStart = protocolEnd + 3;
    const pathStart = url.indexOf('/', hostStart);
    if (pathStart === -1) return '/';

    return url.slice(pathStart);
}

getPathFromUrl('https://example.com/blog/article-1')
// → "/blog/article-1"

// クエリパラメータ前のパスだけ取り出す
function getCleanPath(url) {
    const path = getPathFromUrl(url);
    const qIndex = path.indexOf('?');
    return qIndex === -1 ? path : path.slice(0, qIndex);
}

getCleanPath('https://example.com/blog/article-1?utm_source=google')
// → "/blog/article-1"

7-3. テキストを指定文字数で切り捨てて「...」を付ける

// テキストをmaxLen文字で切り捨てて末尾に"..."を付ける
function truncate(text, maxLen, suffix = '...') {
    if (text.length <= maxLen) return text;
    return text.slice(0, maxLen - suffix.length) + suffix;
}

truncate('JavaScriptで文字列を切り出す完全ガイド', 15)
// → "JavaScriptで文字列..."(15文字以内に収める)

truncate('短いテキスト', 20)
// → "短いテキスト"(maxLen以下ならそのまま)

// 単語の途中で切れないようにする版(英語テキスト向け)
function truncateAtWord(text, maxLen) {
    if (text.length <= maxLen) return text;
    const truncated = text.slice(0, maxLen);
    const lastSpace = truncated.lastIndexOf(' ');
    return (lastSpace > 0 ? truncated.slice(0, lastSpace) : truncated) + '...';
}

7-4. 電話番号・郵便番号のフォーマット変換

// "0312345678"(10桁)→ "03-1234-5678" に変換
function formatPhoneNumber(phone) {
    const digits = phone.replace(/\D/g, '');  // 数字のみ抽出

    if (digits.length === 10) {
        // 市外局番2桁 + 4桁 + 4桁
        return digits.slice(0, 2) + '-' + digits.slice(2, 6) + '-' + digits.slice(6);
    }
    if (digits.length === 11) {
        // 携帯: 090/080/070 3桁 + 4桁 + 4桁
        return digits.slice(0, 3) + '-' + digits.slice(3, 7) + '-' + digits.slice(7);
    }
    return phone;  // 不明な形式はそのまま
}

formatPhoneNumber('0312345678')    // → "03-1234-5678"
formatPhoneNumber('09012345678')   // → "090-1234-5678"

// "1234567"(7桁)→ "123-4567" に変換
function formatPostalCode(zip) {
    const digits = zip.replace(/\D/g, '');
    if (digits.length === 7) {
        return digits.slice(0, 3) + '-' + digits.slice(3);
    }
    return zip;
}
formatPostalCode('1234567')  // → "123-4567"

08 at()・split()・正規表現との組み合わせ 文字列処理をより強力にする関連メソッドとの使い分け

8-1. at():インデックスで1文字取得(-1で最後の文字)

String.prototype.at() は ES2022 で追加された比較的新しいメソッドです。str[-1] のように末尾から1文字を取得するために at(-1) が使えます(ただしサロゲートペアは非対応)。

const str = "Hello World";

// at(): インデックスで1文字取得(負のインデックスが使える)
str.at(0)    // → "H"
str.at(-1)   // → "d"(最後の文字)
str.at(-2)   // → "l"(後ろから2番目)

// 配列アクセス(負のインデックスは使えない)
str[0]       // → "H"
str[-1]      // → undefined(JavaScriptではNG)

// at() と slice(-1) の使い分け
str.at(-1)       // 最後の1文字だけ取りたいとき → at(-1)
str.slice(-3)    // 最後のN文字を取りたいとき → slice(-N)

📚 用語解説

String.prototype.at()メソッド:ES2022(ES13)で追加されたJavaScriptの文字列メソッド。str.at(n) でn番目の文字を返す。負のインデックス(at(-1)で最後の文字)が使える点がstr[n]との最大の違い。ただし内部的にはUTF-16コードユニット単位のため、サロゲートペア(絵文字等)は正しく扱えない。シンプルな1文字取得にはat()、複数文字の切り出しにはslice()を使う。

8-2. split() との組み合わせ:特定区切りで分割してから切り出す

// CSVの最初のカラムだけ取得
const csv = "田中,28,東京,エンジニア";
const fields = csv.split(',');
fields[0]   // → "田中"

// URLのパス部分をスラッシュで分割して最後のセグメントを取得
const url = "https://example.com/blog/2026/article-title";
const path = url.slice(url.indexOf('/', 8));  // "/blog/2026/article-title"
const segments = path.split('/').filter(s => s !== '');  // ["blog","2026","article-title"]
segments[segments.length - 1]  // → "article-title"(最後のセグメント)

// メールアドレスのドメイン部分を取得
const email = "user@example.com";
const atIndex = email.indexOf('@');
const domain = email.slice(atIndex + 1);  // → "example.com"
const localPart = email.slice(0, atIndex); // → "user"

8-3. 正規表現のmatch()と組み合わせる

// HTMLタグを含む文字列からテキストだけ抽出(正規表現 + replace)
const html = "

Hello World

"; const textOnly = html.replace(/<[^>]+>/g, ''); // → "Hello World" // 文字列から数字部分だけ抽出してslice const mixed = "定価12,800円(税込)"; const numStr = mixed.match(/[\d,]+/)?.[0] || ''; // → "12,800" const numOnly = numStr.replace(',', ''); // → "12800" // 日付文字列から年・月・日を取り出す(slice vs 正規表現) const dateStr = "2026-07-19"; // slice での分割 const year = dateStr.slice(0, 4); // "2026" const month = dateStr.slice(5, 7); // "07" const day = dateStr.slice(8, 10); // "19" // 正規表現での分割(可読性重視) const [, y, m, d] = dateStr.match(/(\d{4})-(\d{2})-(\d{2})/) || [];

📚 用語解説

match()メソッド:文字列が正規表現に一致するかを調べ、一致した部分を配列で返すメソッド。グループキャプチャ(()で囲んだ部分)も別々の要素として返す。一致しない場合はnullを返すため、?.[0]のようなnull安全アクセスが必要。slice/substringと組み合わせると、動的なパターンマッチ後の切り出しが可能。

09 Claude Codeで文字列処理コードを自動生成する 要件を自然言語で説明するだけで最適な切り出しコードが得られる

ここまでsubstr・substring・sliceの違い・Unicode対応・実務ユースケースまで網羅して解説しましたが、実際にコードを書く場面では「どのメソッドを使えばいいか、引数をどう書けばいいか」を毎回考えるのは時間のムダです。

Claude Codeに「こういう文字列処理を書きたい」と日本語で指示するだけで、slice・substring・split・正規表現を適切に組み合わせた実用的なコードがすぐに返ってきます。非推奨メソッドを使わない、Unicode対応も考慮した安全なコードを書いてもらえます。

ユースケースClaude Codeへの指示例
URLからドメイン抽出「JavaScriptでURLの文字列からホスト名(ドメイン部分)だけを抽出する関数を書いて。プロトコル(https://等)もパスも除いたもの。edge caseとしてhttp://もhttps://も対応して」
テキスト切り捨て「JavaScriptでテキストを最大N文字に切り詰めて末尾に「…」をつける関数。日本語も正しく扱うこと。Nには「…」の3文字も含める」
非推奨コードの修正「以下のJavaScriptコードのsubstr()をすべてslice()またはsubstring()に書き換えて。動作は変えないで。[コードを貼り付け]」
絵文字対応「絵文字・サロゲートペアを含む日本語テキストを正しく指定文字数で切り出すJavaScript関数を書いて。Intl.Segmenterを使った版とスプレッド演算子版の両方」
要件を日本語で指示
「URLから拡張子を
抜き出す関数」
Claude Codeが生成
slice/substring/split
を適切に使った
コードが返る
ブラウザ・Node.jsで確認
コンソールで
動作確認
必要なら改善指示
「edge caseを
追加して」等を
追加指示
AI鬼管理山崎 AI鬼管理山崎
Claude Codeへの指示に「substrは使わないで、slice()かsubstring()で書いて」と一言添えるだけで非推奨メソッドを回避したコードが返ってきます。古い参考書や記事のコードをそのまま書き写す癖がある方は、Claude Codeに渡して最新の書き方に直してもらうと効率的です。
代表菅澤 代表菅澤
AI鬼管理では、業務システムの文字列処理ロジックをClaude Codeで生成しています。「電話番号のフォーマット統一」「会社名の前株・後株の正規化」など、細かな文字列処理は Claude Code に任せることで、開発時間を大幅に削減しています。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 まとめ:substr・substring・sliceの選択基準 今後はslice()またはsubstring()を使い、substrは書かない

✔️substr()は非推奨(deprecated)。既存コードの読み解き以外では使わない
✔️新規コードはslice()かsubstring()を使う。迷ったらslice()
✔️slice()は負のインデックスが直感的(-1で末尾、-3で末尾から3文字前)
✔️substring()は負のインデックスを0扱い。末尾からの相対指定はsliceを使う
✔️絵文字・サロゲートペアを含む文字列はスプレッド演算子か Intl.Segmenter を使う
✔️substr()を使っているコードは substr(start, len)slice(start, start+len) で書き換えられる
✔️Claude Codeに「substrを使わずslice()かsubstring()で書いて」と指示すれば即座に最適なコードが得られる

JavaScriptを含む業務システムのAI活用・自動化を進めたい方へ

文字列処理の細かな知識より、業務でJavaScriptを活用して何を自動化するかの方が重要です。
AI鬼管理では、フロントエンド・バックエンドを問わず業務システムのAI組み込み・自動化設計を支援しています。

代表菅澤 代表菅澤
「JavaScriptのコードはClaude Codeが書いてくれる。でも何を作ればいいかが分からない」という相談も歓迎です。業務フローの整理から自動化の設計まで一緒に考えます。まずは無料相談でお気軽にどうぞ。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. substrとsubstringの引数の一番分かりやすい覚え方は?

A. substr()の「r」は「長さ(range/length)」のイメージで、第2引数が「文字数」。substring()の「ing」は「〜から〜まで」のイメージで、第2引数が「終了インデックス」と覚えると混乱が減ります。もしくは「substring/sliceは第2引数が終了位置(同じ)、substrだけが文字数(違う)」とsubstrを例外として覚える方法もシンプルです。

Q. substr()はまだ全ブラウザで動きますか?削除されましたか?

A. 2026年7月現在、主要なブラウザ(Chrome・Firefox・Safari・Edge)とNode.jsでsubstr()はまだ動作します。ただし、MDN Web Docsの「deprecated」表示の通り、将来的に削除される可能性があり、積極的な使用は推奨されていません。既存のコードが動いているうちに、新規コードではslice()またはsubstring()に統一する準備を進めることが望ましいです。

Q. 日本語の文字数カウントにlengthを使って問題ないですか?

A. 一般的な日本語(ひらがな・カタカナ・よく使われる漢字)はUnicode BMP内にあるため、str.lengthで正しい文字数が返ります。ただし絵文字(😀等)やごく一部の漢字(𠮷の旧字など)はサロゲートペアのため、lengthで2つとしてカウントされます。絵文字を含む文字列の正確な文字数は[...str].lengthまたはArray.from(str).lengthで確認できます。

Q. slice()とsubstring()の使い分けの判断基準は何ですか?

A. 「末尾からの相対位置を使いたい場合はslice()、使わない場合はsubstring()でもよい」というのが基本の判断基準です。具体的には、末尾5文字を取りたいならslice(-5)、先頭3文字を除いた残りを取りたいならどちらでも書けます(slice(3)またはsubstring(3))。引数の順序が逆転するケース(例: 動的に計算したインデックスが偶然startより小さくなる可能性がある場合)はsliceの方が「空文字列を返して失敗を明示する」ため安全です。

Q. 文字列の一部を別の文字列に置き換えるには?

A. slice()で切り出した部分を組み合わせて置き換える方法と、replace()・replaceAll()メソッドを使う方法があります。特定位置の文字を置き換えたい場合: str.slice(0, i) + newChar + str.slice(i + 1)のようにsliceで前後を取り出して繋げます。文字列として出現する部分を置き換えたい場合: str.replace("old", "new")またはstr.replaceAll("old", "new")が簡潔です。

Q. Claude CodeにJavaScriptの文字列処理を書いてもらうとき、どんな指示が効果的ですか?

A. ①何の文字列から何を取り出したいか(例: 「メールアドレスからドメイン部分だけ」)、②入力例と期待する出力例を数個(例: 「"user@example.com" → "example.com"」)、③edge case(例: 「@が複数ある場合・@がない場合はどうする」)、④使ってほしくないメソッド(例: 「substrは使わないで」)の4点をセットで伝えると、一発で実用的なコードが返ってくる可能性が高くなります。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。