複数のスペースを1つのスペースに置き換える正規表現


510

次のような文字列が与えられたとします。

「犬はしっぽが長くて、赤い!」

スペースを最大1つのスペースに保つために、どのようなjQueryまたはJavaScriptマジックを使用できますか?

ゴール:

「犬はしっぽが長くて、赤い!」

4
ホワイトスペースのタブ文字も一致させますか?
Chris Farmer、

@クリス、はい、いい質問です...これらすべての異なる答えを使用して、最も効率的な解決策を知るにはどうすればよいですか?
AnApprentice 2009

2
以下の全員が正しいですが、これは最も最適化された正規表現str.replace(/ +(?= )/g,'');です。必要のないものは置き換えません。
エヴァンキャロル

2
パフォーマンスに目立った違いはありません。いつでもそれをプロファイリングできますが、それだけの価値があるとは思えません。私は最も明確に行きます。
ドラえもん09

@EvanCarroll:正しくありません-少なくともFirefoxでは。そのバージョンは実行が著しく遅くなります。私の回答(下記)のプロファイリング結果を参照してください。
Edward Loper

回答:


937

あなたもカバータブ、改行などにしたいことを考えると、単に置き換える\s\s+' '

string = string.replace(/\s\s+/g, ' ');

スペースのみをカバーしたい(したがって、タブや改行などをカバーしない)場合は、次のようにします。

string = string.replace(/  +/g, ' ');

4
また、 'g'フラグを正規表現に追加する必要があります。
Rafael、

6
これは、タブや改行ではなく空白が必要な場合には機能しません。正しい?/ \ s + /は機能します。
ファビアン

3
次のような機能としては、より良いかもしれませんfunction removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
Math chiller

5
@Ethan:JSにはそのための組み込み関数がありますtrim()。正規表現よりも高速です。あなたは何ができますstring.trim().replace(/\s\s+/g, ' ');string.replace(/\s\s+/g, ' ').trim();
BalusC

4
/\s\s+/gそして/\s{2,}/g、少なくとも2つが隣接している場合を除き、空白文字とは一致しません。たとえば、\ t \ tとは一致しますが、単一の\ tとは一致しません。string.replace(/\s+/g, ' ')すべての単一および複数の空白文字の部分文字列に一致し、単一のスペースに置き換えられます。
remyActual

159

パフォーマンスに興味があるようですので、Firebugでこれらのプロファイルを作成しました。これが私が得た結果です:

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

これはFirefoxで、100k文字列置換を実行しています。

パフォーマンスに問題があると思われる場合は、firebugを使用して独自のプロファイリングテストを行うことをお勧めします。人間は、プログラムのボトルネックがどこにあるかを予測することで悪名高い。

(また、IE 8の開発者ツールバーにもプロファイラーが組み込まれていることに注意してください-IEのパフォーマンスを確認する価値があるかもしれません。)


5
jsperf.com/removing-multiple-spaces進んでJSPerf!最後の方法。( / +(?= )/g, ' ');IE9では失敗し、二重スペースが"Foo Bar Baz".replace(/ +(?= )/g, ' ');"Foo Bar Baz"
残り

どのように多くの差分bw 1と2行目があるか
Vivek Panday

@VivekPanday-これは、2行目がダブルスペースの出現を1つのスペースに置き換えるだけで、1行目もスペースをスペースに置き換えるためだと思います。これが検索時間の節約なのか、実際の置換なのかはわかりません。
Maloric

これは、最初と最後の空白を削除しません。それについてはこの答えを見てください。
イーサン、

速度を下げて注文順に編集しました。VivekとMaloricのコメントは、380ミリ秒と790ミリ秒の行を参照しています。
Skippy le Grand

43
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

編集: すべての種類の空白文字を置き換えたい場合、最も効率的な方法は次のようになります:

str = str.replace(/\s{2,}/g,' ');

面白いことに、テスト文字列には2つのスペースすらありません。
Josh Stodola、

ちょうどあなたが私が最近思いついたものをすでに持っていることに気づきました、+ 1 :)
meder omuraliev 09/12/30

2
何らかの理由でこれが機能していません...多くの " " CKEDITORが原因である可能性があります...
AnApprentice 2009

KはJQUERYのtext()が物事を台無しにしていたことがわかりました。修正-すべてに感謝します!
AnApprentice 2009

16

これは1つの解決策ですが、すべてのスペース文字をターゲットにます。

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

編集:1つ以上のスペースが続くスペースをターゲットにするため、これはおそらくより良いです:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

代替方法:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

/\s+/1文字にまたがるスペースが複数回置換され、必要以上にターゲットを絞るので効率が低下する可能性があるため、私はそれ自体は使用しませんでした。

私はこれらのどれも深くテストしなかったので、バグがある場合はlmkを実行しました。

また、文字列の置換を行う場合は、変数/プロパティを独自の置換に再割り当てすることを忘れないでください。例:

var string = 'foo'
string = string.replace('foo', '')

jQuery.prototype.textの使用:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )

1
最初の例は完全に無意味です。\ s \ s +は、\ sの後に1つ以上の\ s +が続き、1つの\ s +に削減できます。2番目の例は、二重スペースのみを置き換えたいため、より正確です。改行、3つ目は2つ以上のスペースがある例にのみ適用されるため、より最適化されています。しかし、str.replace(/ +(?=)/ g、 '');は、2つ以上のスペースがある例にのみ適用されますが、スペースステップでスペースを上書きすることを節約します。
エヴァンキャロル

4
\ s \ s +は\ s +と明らかに異なるため、EvanCarrollは失敗します。\ s \ s +は「\ t \ t」または「\ t \ t \ t」と一致しますが、「\ t」とは一致しません。そして、それがすべてです。すべてのf-en単一の空白文字を置き換えたくありません。
2009

私がやります。全文検索(およびスニペット表示)に使用:ランダムなタブ、非ブレーカー、またはThingymajigは使用しないでください。
T4NK3R 2016年

13

私はこのメソッドを持っています。適切な名前がないため、これをDerpメソッドと呼びます。

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

JSPerfで実行すると、驚くべき結果が得られます。


2
実際には高速ではなく、テストケースを作成したことが判明した場合、私は地獄のように恥ずかしいことになります:D
Nenotlep 2013

テストケースを提供しています...すばらしい答えです!
Oytun 2014年

2
これは私の日を作りました:-)「derping」がすべての「賢い」よりもよく機能する方法がおかしいです。「ダープスプリット」はそのお尻を蹴ったように見えます。それでも、賛成に値する。
Fred Gandt、2015

13

より堅牢な方法:最初のスペースと末尾のスペースが存在する場合は、これ削除されます。例えば:

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

あなたの例にはそれらのスペースはありませんでしたが、それらも非常に一般的なシナリオであり、受け入れられた答えは、「The ... RED!」のように、それらを単一のスペースにトリミングすることだけでした。これは通常必要なものではありません。


3
私はこのパターンをPHPで使用して動作しました。$ parts = preg_split( "/ ^ \ s + | \ s + $ | \ s +(?= \ s)/"、 "Avenida Tancredo Neves、745 PisoTérreoSala");
ブルーノリベイロ2017年

11

より堅牢:

関数トリム(単語)
{
    word = word.replace(/ [^ \ x21- \ x7E] + / g、 ''); //非印刷文字をスペースに変更します
    return word.replace(/ ^ \ s + | \ s + $ / g、 ''); //先頭/末尾のスペースを削除します
}

8

私は提案します

string = string.replace(/ +/g," ");

スペースだけの場合
OR

string = string.replace(/(\s)+/g,"$1");

複数の収益を単一の収益に変えるためにも。


6

私はパーティーに遅れることは知っていますが、良い解決策を見つけました。

ここにあります:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');

6

replaceを使用したくない場合の代替ソリューションを次に示します(replace javascriptを使用せずに文字列のスペースを置換します)。

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);

5

初心者向けの包括的な暗号化されていない回答。

これは、私のような、動作しない一部の人が作成したスクリプトをテストするすべてのダミーのためのものです。

次の3つの例は、次の3つのWebサイト(すべて正常に機能する)で特殊文字と余分なスペースを削除するために実行した手順です。{1。EtaVisa.com 2. EtaStatus.com 3. Tikun.com}なので、これらは完全に機能します。

私たちはこれらを一度に50以上にチェーンし、問題はありませんでした。

//これにより、特殊文字+ 0-9が削除され、文字のみが許可されます(大文字と小文字)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

//これにより、特殊文字が削除され、文字(大文字と小文字)と0-9 ANDスペースのみが許可されます

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

//これは特殊文字を削除し、文字(大文字と小文字)と0-9のANDスペースのみを許可します//末尾の.replace(/ \ s \ s + / g、 "")は余分なスペースを削除します// I一重引用符を使用すると、機能しませんでした。

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

::次:: #3を保存しますa .js//私はNoDoubles.jsを呼び出しました

::次:: ページにJSを含めます

 <script language="JavaScript" src="js/NoDoubles.js"></script>

これをフォームフィールドに含める::など

<INPUT type="text" name="Name"
     onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

こんな感じに

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

これにより、特殊文字が削除され、単一のスペースが許可され、余分なスペースが削除されます。


ここで何が起こっているのですか?書式設定は非常に壊れています。
Nenotlep


1
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

または、タブも置き換えたい場合:

var replaced = string.replace(/\s+/g, " ");

1
+の使用はよりすっきりしているように見えますが、単一のスペースが単一のスペースに置き換えられ、少し冗長であり、確信が持てませんが、はるかに長いテキストでパフォーマンスの問題が発生する可能性があります。
ahmetunal 2009

私は機能する最も短い、最も単純なソリューションを使用する傾向があり、非常に大きな文字列と照合する必要があることがわかっている場合にのみそのような最適化について心配します。その時点で実際にさまざまなソリューションを測定して、より速くなる。テストなしで何が最速になるかを事前に予測するのは難しい場合があります。たとえば、JavaScriptインタープリターでは、いくつかの複雑な正規表現により、高速のJITコンパイル済み実装から低速のインタープリター実装に切り替えることがあります。
ブライアンキャンベル

1

jqueryには、基本的にこの「FOo Bar」のようなものを「FOo Bar」に変換するtrim()関数があります。

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

文字列の最初と最後の空のスペースも自動的に削除されるため、はるかに便利です。正規表現は必要ありません。


3
あなたが言ったように、trim()は文字列の最初最後の空のスペースを削除しますが、文字列の中央は削除しないため、この場合は機能しません。出力は「My String with Multiple行」。api.jquery.com/jQuery.trim
egvaldes

1

is replaceは使用されません、string = string.split(/ \ W + /);



0

sed systemコマンドを使用して説明された次の正規表現を使用できます。同様の正規表現は、他の言語やプラットフォームでも使用できます。

テキストをいくつかのファイルに追加して、テストを言います

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

次の正規表現を使用して、すべての空白を単一のスペースに置き換えることができます

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

これが目的に役立つことを願って


0

複数のスペースを1つのスペースに置き換えるには、これを試してください。

<script type="text/javascript">
    var myStr = "The dog      has a long   tail, and it     is RED!";
    alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'

    var newStr = myStr.replace(/  +/g, ' ');
    alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

続きを読む@ 複数のスペースを1つのスペースに置き換える


0
var text = `xxx  df dfvdfv  df    
                     dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' ');

結果:

"xxx df dfvdfv df dfv"

0

さらに制御するには、replaceコールバックを使用して値を処理できます。

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"

0

このスクリプトは、単語とトリムの間の空白(複数のスペース、タブ、改行など)を削除します。

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
  var _trimLeft  = /^\s+/,
      _trimRight = /\s+$/,
      _multiple  = /\s+/g;

  return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};


0

正規表現を使用する必要があることはわかっていますが、インタビュー中に、正規表現を使用せずに実行するように求められました。

@slightlytylerは、以下のアプローチを考え出すのに役立ちました。

const testStr = "I   LOVE    STACKOVERFLOW   LOL";

const removeSpaces = str  => {
  const chars = str.split('');
  const nextChars = chars.reduce(
    (acc, c) => {
      if (c === ' ') {
        const lastChar = acc[acc.length - 1];
        if (lastChar === ' ') {
          return acc;
        }
      }
      return [...acc, c];
    },
    [],
  );
  const nextStr = nextChars.join('');
  return nextStr
};

console.log(removeSpaces(testStr));


検討してください:console.log(testStr.split( "").filter(s => s.length).join( ""))
dpjanes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.