文字列の最初と最後からスペースを削除


152

タイトル文字列の最初と最後からスペースを削除する方法を見つけようとしています。私はこれを使用していましたが、動作していないようです:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');

何か案は?


1
var s = '1'; s = s.replace(/ ^ \ s + | \ s + $ / g、 ''); alert( '-' + s + '-'); //それはこのように機能し、括弧や角括弧は必要ありません。
ekerner 2013年

2
JavaScriptが.trim組み込まれているので、これが最新のブラウザーの答えです。stackoverflow.com
a

この記事を参照してください:javascriptstutorial.com/blog/trim-string

function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
Badri Gs 2017

回答:


216

注:2015年現在、すべての主要なブラウザー(IE> = 9を含む)はString.prototype.trim()をサポートしています。これは、ほとんどのユースケースで、単純に行うstr.trim()ことが、質問の内容を達成するための最良の方法であることを意味します。


Steven Levithanはtrim、Javascriptのさまざまな実装をパフォーマンスの観点から分析しました。

彼の推薦は:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

「高速なクロスブラウザである汎用的な実装」

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

「すべてのブラウザで非常に高速に長い文字列を処理したい場合」。

参考文献


21
新しいSafari(5)、Chrome(5)、Firefox(3.6)、Opera(10.5)はすべてネイティブの文字列トリムメソッドをサポートしています。その場合、新しいグローバル関数ではなく、存在しない場合はString.prototypeにメソッドを割り当てます。
kennebec

14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
kojiro

3
JavaScriptのパフォーマンスが最近改善された後、このテストがこの回答の時点と同じように、関連性または信頼性があることに疑問があります。
Eduardo

2
なぜ二重の白い文字を使用しているのですか?別名この正規表現で/^\s\s*/あり、これではない理由/^\s*/
aemonge

なぜtrim1そしてtrim11
Marty Cortez

68

jQueryの使用がオプションの場合:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

または単に:

$.trim(string);

48

以下のよう@ChaosPandionが述べたように、String.prototype.trim方法が導入されているのECMAScript第5版の仕様、いくつかの実装では、すでにこの方法を含め、その最良の方法は、ネイティブ実装を検出し、それを宣言することでのみ、それは利用できない場合:

if (typeof String.prototype.trim != 'function') { // detect native implementation
  String.prototype.trim = function () {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  };
}

次に、簡単にできます:

title = title.trim();

1
プロパティが関数であるかどうかをチェックするこのミームにはいつも少し戸惑っています。それが関数でない場合、本当にそれを上書きする正しい動作ですか?おそらく、その場合はエラーをスローする必要があります。
kojiro

1
@kojiro、ええと、エラーをスローするのは良いことかもしれませんが、次のように表示されます。仕様に準拠したshimを作成しようとしてString.prototype.trimいます。関数でない場合、ECMAScript 5版で説明されているメソッドではありません。String.prototype.trim仕様は、仕様trimがES5環境の関数オブジェクトであることを保証します。
CMS

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
小次郎

34

私はこれが古い投稿であることを知っていますが、私たちの解決策を共有したいと思っていました。最短のコード(誰もが単純な正規表現を気に入っているわけではありません)の探求では、代わりに以下を使用できます。

title = title.replace(/(^\s+|\s+$)/g, '');

ところで、私はblog.stevenlevithan.com上で共有されたリンクを介して同じテストを実行しました-より速いJavaScriptトリムとこのパターンは、他のすべてのHANDSを打ち負かしました!

IE8を使用して、test13としてテストを追加しました。結果は次のとおりです。

元の長さ:226002
trim1:110ms(長さ:225994)
trim2:79ms(長さ:225994)
trim3:172ms(長さ:225994)
trim4:203ms(長さ:225994)
trim5:172ms(長さ:225994)
trim6:312ms(長さ: 225994)
trim7:203ms(長さ:225994)
trim8:47ms(長さ:225994)
trim9:453ms(長さ:225994)
trim10:15ms(長さ:225994)
trim11:16ms(長さ:225994)
trim12:31ms(長さ:225994)
trim13:0ms(長さ:226002)



11

ここで、これはあなたが必要とするすべてを行うはずです

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s + sがあるので\ s \ s *は冗長に見えますが、少し高速です
CaffGeek

4

これが、jsで文字列をトリムするために過去に使用したいくつかの方法です。

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

RegExp は文字列の先頭で^[\s*]+一致*するため、関数はに切り捨て"*** Foo"られ"Foo"ます。
フェルディナンドバイエル

おそらく:)誰も文句を言っていないのか不思議に思っています...ずっと前に私がそのコードを書いて、それがen.wikipedia.org/wiki/Wikipedia:Twinkleで使用されています。あなたがそれを指摘した今、それは明白です。
azatoth

4

これが私の現在のコードです。3行目にコメントを付けると2行目は機能しますが、そのままにしておくと機能しません。

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

2行目と3行目を削除し、polygenelubricantsのコードを使用します。page_title= trim1(page_title);
ant

したがって、最終的には、この文字列を、区切り文字としてスペースではなく、トリミングされ、英数字とダッシュにクリーンアップしようとしていますか?
CaffGeek

@chadはい。ユーザーが自分のURLがどのように見えるかを確認できるように、オンザフライでURLを作成する。WordPressが新しいブログ投稿を作成するときの方法と似ています。
James Jeffery、


2

jQuery.trim( "こんにちは、お元気ですか?");

:)


2
あなたはおかしいと思われるかもしれませんが、このコメントを読んでいる人はあなたの解決策を使って動きたくなるかもしれません。
コンマ区切りの2013年

$ .trim( "blabh blah blah"); 「blabh blah blah」を正しく返す
RAY

2

DOMが完全に読み込まれたら、すべてのテキストフィールドに追加できます。先頭または末尾のスペースを送信する必要があった状況はありませんでした。そのため、世界中で常にそれを行うことがうまくいきました...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

jQueryが必要です。別の質問(私はテストしませんでした):blurフィールドにいるときに送信前に実際に発生し、<kbd> Enter </ kbd>を押してフォームを送信しますか?
amenthes

2

これは、JavaScript Architect / Guru Douglas Crockfordによって提案されたものです。

String.method('trim', function (  ) {
    return this.replace(/^\s+|\s+$/g, '');
});

注:Function.prototypeの「メソッド」を定義する必要があります。

あるいは

String.prototype.trim = function () {
   return this.replace(/^\s+|\s+$/g, '');
};

title.trim();    // returns trimmed title

観察

最近のブラウザでは、trimメソッドがデフォルトで含まれています。したがって、明示的に追加する必要はありません。

主要なブラウザChrome、Firefox、Safariなどは、trimメソッドをサポートしています。Chrome 55.0.2883.95(64ビット)、Firefox 51.0.1(64ビット)、Safari 10.0(12602.1.50.0.10)でチェックイン。


1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

if(x.length > 0)
    alert('word');
else
    alert('spaces');

0

これに対する再帰的な試み

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

このように呼び出します:

t("      mehmet       "); //=>"mehmet"

特定の文字をフィルタリングする場合は、基本的にリスト文字列を定義できます。

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

質問されているものとは微妙な違いがあります!スペースをチェックしています' 'が、問題は、を含む一般的な空白"\n""\t"およびによって正規表現で一致する他の印刷できない文字について/\s/です。
amenthes

その後、if条件を "if(" \ t \ r \ n ".indexOf(k [0])>-1)"として編集することもできますが、これらはすでに機能しています。これらはすでに特定のタイプです。
mguven guven 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.