トリム
文字列の前後の空白を除去する処理。多くのプログラミング言語で標準メソッドとして提供される。
トリム (trim) とは、文字列の先頭と末尾にある空白文字 (スペース、タブ、改行など) を除去する処理です。ほぼすべてのプログラミング言語に標準メソッドとして用意されており、ユーザー入力のバリデーション、データベースへの保存前処理、テキスト比較の前処理など、あらゆる場面で使用される基本的な文字列操作です。
各言語でのトリム実装は微妙に異なります。JavaScript では String.trim() に加え、先頭のみを除去する trimStart() と末尾のみを除去する trimEnd() が ES2019 で標準化されました。Python では str.strip() が両端、lstrip() が先頭、rstrip() が末尾を除去します。Java 11 では従来の trim() に加えて strip() が追加されましたが、この 2 つは対象とする文字の定義が違います。trim() は「コードポイントが U+0020 以下の文字」を落とす定義なので、全角スペース (U+3000) やノーブレークスペース (U+00A0) は残ります。strip() は Java の空白判定に従うため全角スペースは除去されますが、ノーブレークスペースは非改行スペースとして空白判定から除かれているので、こちらでも残ります。ここで注意したいのは、この trim と strip の対比が Java の中だけの話だという点です。JavaScript の trim() と Python の str.strip() はどちらも全角スペースとノーブレークスペースを除去するため、メソッド名から挙動を推測すると読み違えます。
実務でトリムが特に重要になるのは、フォーム入力の処理です。ユーザーがテキストフィールドにコピー&ペーストすると、前後に不要な空白が混入することがよくあります。メールアドレスの前後に空白があるとログインに失敗する、検索クエリの末尾にスペースがあると検索結果が変わるなど、トリムを怠ると予期しない不具合の原因になります。値を検索キーや重複判定に使う場合は、両端を落とすだけでは足りず、語の間に入り込んだ連続空白をひとつにまとめる処理も必要になります。なお、トリムはあくまで表記を揃える正規化であって、エスケープや入力値の検証の代わりにはなりません。両端の空白を落としたから安全になった、と考えると本来必要な検証が抜け落ちます。
よくある注意点は、どの文字までを空白とみなすかが実装ごとに違うことです。ゼロ幅スペース (U+200B) は JavaScript の trim() でも Python の str.strip() でも残ります。幅を持たない文字は空白ではなく書式制御の文字として扱われることが多く、コピー元のページや PDF から混入すると、空欄に見えるのに空文字列ではない、という判定のずれを起こします。BOM (U+FEFF) はさらに厄介で、JavaScript の trim() は除去しますが Python の str.strip() は残すため、同じ入力を両方で処理すると結果が食い違います。Unicode 正規化を併用するのも手で、NFKC は全角スペースとノーブレークスペースをどちらも半角スペースへ写すので、正規化を先に済ませてからトリムすると言語差の影響を小さくできます。ただしゼロ幅スペースと BOM は NFKC でも変化しないため、これらは除去したい文字を明示して個別に扱う必要があります。また日本語の文章では字下げに全角スペースを使うことがあり、両端を一律にトリムすると意図した字下げが消えます。
文字数カウントとの関連では、トリムの有無が文字数に直接影響します。「 こんにちは 」(前後に半角スペース) は 7 文字ですが、トリム後は 5 文字になります。同じ文章でも「空白を含む数え方」と「空白を除く数え方」で結果が変わるため、文字数制限を確認するときは、制限を課している側が両端の空白をどう数えるかに合わせるのが基本です。仕様が分からない場合は、空白を含めた多いほうの数え方で見ておくと制限を超えにくくなります。