できない.dev

文字列の前後の空白を除去するには

入力の前後に付いた空白・タブ・改行をまとめて落とす基本形を各言語で示す。
引数を渡す形が「除去する文字の集合」であって前置詞ではない点と、全角スペースを消せるかどうかの差までを扱う。

公開:

各言語見出しの横のバッジは検証状態を表す。実行確認済みはコードを実際に実行して確認したもの、静的確認は構文と公式 API ドキュメントで確認したものである。

Python 実行確認済み

raw = "  2026-08-11  \r\n"
print(repr(raw.strip()))                 # -> '2026-08-11'(空白も改行も CR もまとめて消える)
print(repr(raw.rstrip()))                # 末尾だけ -> '  2026-08-11'
print(repr("xxhello.pyxx".strip("x")))   # -> 'hello.py'
print(repr("banana".strip("ba")))        # 引数は文字の集合 -> 'nan'
print(repr("banana".removeprefix("ba"))) # 前置詞として消す -> 'nana'

str.strip は前後の空白・タブ・改行・CR をまとめて落とす。
引数を渡した場合、それは前置詞や接尾辞ではなく「除去する文字の集合」として扱われるため、"banana".strip("ba") は 'nan' になる。
決まった接頭辞・接尾辞だけを外したいときは removeprefix / removesuffix を使う。

うまくいかない時: Git で「LF will be replaced by CRLF」の警告が消せないBash で「/bin/bash^M: bad interpreter」が解決できない

JavaScript 実行確認済み

const raw = "  2026-08-11  \r\n";
console.log(JSON.stringify(raw.trim()));      // "2026-08-11"
console.log(JSON.stringify(raw.trimEnd()));   // "  2026-08-11"
console.log(JSON.stringify(raw.trimStart())); // "2026-08-11  \r\n"
console.log(JSON.stringify("\u3000全角\u3000".trim())); // "全角"(全角スペースも消える)

String.prototype.trim は前後の空白文字を落とし、片側だけなら trimStart / trimEnd を使う。
ここでいう空白文字には半角スペースやタブ・改行に加えて全角スペース(U+3000)も含まれるため、日本語の入力フォームでもそのまま使える。
除去する文字を指定する引数は無いので、特定の文字を外したいときは replace を使う。

うまくいかない時: Git で「LF will be replaced by CRLF」の警告が消せない

TypeScript 実行確認済み

const raw: string = "  2026-08-11  \r\n";
const cleaned: string = raw.trim();
console.log(JSON.stringify(cleaned)); // "2026-08-11"
 
// CSV の各項目を整えるときは分割してから trim する
const fields: string[] = " a , b ,c ".split(",").map((s: string) => s.trim());
console.log(fields); // [ 'a', 'b', 'c' ]

使い方は JavaScript と同じで、戻り値が string として型付けされるだけである。
型の上では「trim 済みかどうか」は区別されないため、検証を通した値だけを別の型として扱いたい場合はブランド型を自分で定義する必要がある。
CSV や環境変数のように前後の空白が紛れ込みやすい入力は、受け取った直後に trim する。

Go 静的確認

package main
 
import (
	"fmt"
	"strings"
)
 
func main() {
	raw := "  2026-08-11  \r\n"
	fmt.Printf("%q\n", strings.TrimSpace(raw))          // "2026-08-11"
	fmt.Printf("%q\n", strings.TrimRight(raw, " \r\n")) // 末尾だけ
	fmt.Printf("%q\n", strings.Trim("xxhello.goxx", "x"))
	fmt.Printf("%q\n", strings.TrimPrefix("banana", "ba")) // 前置詞として消す
}

strings.TrimSpace は Unicode の空白定義に従って前後の空白を落とす。
strings.Trim / TrimLeft / TrimRight に渡す第2引数は cutset と呼ばれる「除去する文字の集合」で、文字列そのものとしては扱われない。
接頭辞・接尾辞を外したいときは TrimPrefix / TrimSuffix を使う。

Rust 静的確認

fn main() {
    let raw = "  2026-08-11  \r\n";
    println!("{:?}", raw.trim());       // "2026-08-11"
    println!("{:?}", raw.trim_end());   // "  2026-08-11"
    println!("{:?}", "xxhello.rsxx".trim_matches('x'));
    println!("{:?}", "banana".strip_prefix("ba")); // Some("nana")
}

str::trim は前後の空白を落とした部分文字列(&str)を返すため、新しい String は確保されない。
特定の文字を落とすなら trim_matches に char やクロージャを渡す。
接頭辞を外す strip_prefix は一致しなければ None を返すので、外れたかどうかを戻り値で判定できる。

Java 実行確認済み

public class Main {
    public static void main(String[] args) {
        String raw = "  2026-08-11  \r\n";
        System.out.println("[" + raw.strip() + "]");         // [2026-08-11]
        System.out.println("[" + raw.stripTrailing() + "]"); // [  2026-08-11]
 
        String full = "\u3000全角\u3000";
        System.out.println("strip : [" + full.strip() + "]"); // 全角スペースも消える
        System.out.println("trim  : [" + full.trim() + "]");  // trim では残る
    }
}

String.strip は Character.isWhitespace の定義で前後の空白を落とすため、全角スペース(U+3000)も除去できる。
古くからある trim は U+0020 以下の文字しか対象にせず全角スペースが残るので、日本語を扱うなら strip を選ぶ。
片側だけなら stripLeading / stripTrailing を使う。

C# 実行確認済み

using System;
 
class Program {
    static void Main() {
        var raw = "  2026-08-11  \r\n";
        Console.WriteLine($"[{raw.Trim()}]");    // [2026-08-11]
        Console.WriteLine($"[{raw.TrimEnd()}]"); // [  2026-08-11]
        Console.WriteLine($"[{"xxhello.csxx".Trim('x')}]");  // [hello.cs]
        Console.WriteLine($"[{"banana".Trim('b', 'a')}]");   // 文字の集合 -> [nan]
    }
}

string.Trim は引数なしで前後の空白を落とし、char を渡すとその文字の集合を除去する。
Python や Go と同じく集合として扱われるので、"banana".Trim('b', 'a') は "nan" になる。
接頭辞だけを外したいときは StartsWith で確かめてから Substring で切るか、TrimStart ではなく明示的に処理する。

つまずき

引数付きの trim / strip を「この文字列を前から消す」と読むと結果が合わない。
Python の strip、Go の Trim、C# の Trim、Rust の trim_matches はいずれも引数を「除去する文字の集合」として扱うため、"banana" から "ba" を落とすと先頭の b と a、末尾の a が消えて 'nan' が残る。
接頭辞・接尾辞として外したいときは、Python なら removeprefix、Go なら TrimPrefix、Rust なら strip_prefix のように別の関数を使う。

全角スペースが消えるか

日本語の入力では全角スペース(U+3000)が前後に紛れ込むことがある。
JavaScript の trim、Python の strip、Java の strip は全角スペースも空白として除去するが、Java に古くからある trim は U+0020 以下しか対象にしないため全角スペースが残る。
Java 11 以降を使えるなら trim ではなく strip を選ぶ。
フォーム入力を突き合わせて「同じはずなのに一致しない」ときは、この差を最初に疑う。

改行と CR

Windows で作られたファイルやクリップボード経由の入力には行末に CR(\r)が残る。
前後の空白を落とす関数はいずれも CR を空白として扱うので、行を trim すれば一緒に消える。
逆に言えば、trim せずに比較や数値変換をすると原因の見えにくい不一致になる。
行単位で読み込んだ文字列は、比較の前に trim しておくと安全である。

この記事は役立ちましたか?