Regex untuk mengganti beberapa ruang dengan satu ruang

511

Diberikan string seperti:

"Anjing itu memiliki ekor panjang, dan itu MERAH!"

Jenis sihir jQuery atau JavaScript apa yang dapat digunakan untuk menjaga ruang hanya satu maks ruang?

Tujuan:

"Anjing itu memiliki ekor panjang, dan itu MERAH!"
AnApprentice
sumber
4
Apakah Anda juga ingin mencocokkan karakter tab whitespacy?
Chris Farmer
@ Chris, Ya tolong, pertanyaan bagus .... Dengan semua jawaban yang berbeda ini, bagaimana orang seharusnya tahu solusi mana yang paling efisien?
AnApprentice
2
Semua orang di bawah ini benar, tetapi ini adalah regex yang paling optimal: str.replace(/ +(?= )/g,'');Anda tidak mengganti apa pun yang tidak perlu.
Evan Carroll
2
Tidak akan ada perbedaan mencolok dalam kinerja. Anda selalu dapat membuat profil, tapi saya ragu itu akan sia-sia. Saya akan mencari yang paling jelas.
Draemon,
@EvanCarroll: Tidak benar - setidaknya di Firefox. Versi itu berjalan lebih lambat secara signifikan. Lihat hasil profil di jawaban saya (di bawah).
Edward Loper

Jawaban:

937

Mengingat Anda juga ingin menutup tab, baris baru, dll, cukup ganti \s\s+dengan ' ':

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

Jika Anda benar-benar hanya ingin menutupi spasi (dan karenanya bukan tab, baris baru, dll), lakukan itu:

string = string.replace(/  +/g, ' ');
BalusC
sumber
4
Anda juga perlu menambahkan bendera 'g' ke regex.
Rafael
6
Ini tidak berfungsi ketika kosong, bukan tab atau baris baru diperlukan. Baik? / \ s + / akan berfungsi.
Fabian
3
mungkin akan lebih baik bagi Anda sebagai fungsi sepertifunction removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
Math chiller
5
@Ethan: JS memiliki fungsi builtin untuk itu: trim(). Lebih cepat dari regex. Anda bisa melakukan string.trim().replace(/\s\s+/g, ' ');atau string.replace(/\s\s+/g, ' ').trim();.
BalusC
4
/\s\s+/gdan /\s{2,}/gtidak cocok dengan karakter spasi putih kecuali ada setidaknya dua yang berdekatan satu sama lain, misalnya akan cocok \ t \ t tetapi tidak akan cocok dengan tunggal \ t. string.replace(/\s+/g, ' ')akan cocok dengan semua substring karakter tunggal dan beberapa spasi putih dan ganti dengan ruang tunggal.
remyAktual
159

Karena Anda tampaknya tertarik dengan kinerja, saya memprofilkan ini dengan pembakar. Inilah hasil yang saya dapatkan:

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

Ini ada di Firefox, menjalankan penggantian string 100k.

Saya mendorong Anda untuk melakukan tes profil Anda sendiri dengan pembakar, jika Anda berpikir kinerja adalah masalah. Manusia terkenal buruk dalam memprediksi kemacetan dalam program mereka.

(Juga, perhatikan bahwa bilah alat pengembang IE 8 juga memiliki profiler bawaan - mungkin perlu memeriksa seperti apa kinerjanya di IE.)

Edward Loper
sumber
5
jsperf.com/removing-multiple-spaces Gowards and JSPerf! Metode terakhir; ( / +(?= )/g, ' ');gagal di IE9, ia meninggalkan ruang ganda: "Foo Bar Baz".replace(/ +(?= )/g, ' ');->"Foo Bar Baz"
Nenotlep
bagaimana ada banyak perbedaan dengan baris 1 dan 2
Vivek Panday
@VivekPanday - Saya membayangkan ini karena baris kedua hanya mengganti kemunculan spasi ganda dengan spasi tunggal, sedangkan yang pertama mengganti ruang apa pun dengan spasi juga. Apakah ini waktu yang disimpan selama pencarian atau penggantian yang sebenarnya, saya tidak tahu.
Maloric
Ini tidak menghapus spasi putih awal dan akhir. Untuk itu lihat jawaban ini .
Ethan
Diedit sesuai pesanan dengan mengurangi kecepatan. Komentar Vivek dan Maloric merujuk pada baris dengan 380 ms dan 790 ms.
Skippy le Grand Gourou
43
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

EDIT: Jika Anda ingin mengganti semua jenis karakter spasi putih, cara yang paling efisien adalah seperti itu:

str = str.replace(/\s{2,}/g,' ');
Watain
sumber
Lucu senar tes Anda bahkan tidak memiliki dua ruang di dalamnya.
Josh Stodola
baru sadar Anda sudah memiliki apa yang saya baru-baru ini datang dengan, 1 :)
meder omuraliev
2
Untuk beberapa alasan ini tidak berfungsi ... Banyak "& nbsp;" muncul ... Mungkin karena CKEDITOR ...
AnApprentice
K ternyata teks JQUERY () mengacaukan semuanya. diperbaiki - terima kasih semua!
AnApprentice
16

Ini adalah salah satu solusi, meskipun akan menargetkan semua karakter ruang:

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

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

Sunting : Ini mungkin lebih baik karena menargetkan ruang diikuti oleh 1 atau lebih ruang:

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

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

Metode alternatif:

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

Saya tidak menggunakannya /\s+/dengan sendirinya karena itu menggantikan spasi yang menjangkau 1 karakter beberapa kali dan mungkin kurang efisien karena menargetkan lebih dari yang diperlukan.

Saya tidak menguji secara mendalam semua ini jadi lmk jika ada bug.

Juga, jika Anda akan melakukan penggantian string ingatlah untuk menetapkan kembali variabel / properti untuk penggantiannya sendiri, misalnya:

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

Menggunakan jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )
meder omuraliev
sumber
1
Yang pertama sama sekali tidak ada gunanya, \ s \ s + berarti, sebuah \ s diikuti oleh satu atau lebih \ s +, yang dapat direduksi menjadi satu \ s +, contoh kedua lebih akurat karena kami hanya ingin mengganti spasi ganda, tidak baris baru, yang ketiga lebih dioptimalkan karena hanya berlaku untuk contoh dengan 2+ spasi. Tetapi str.replace (/ + (? =) / G, '') ;, hanya berlaku untuk contoh dengan 2+ spasi tetapi menghemat menimpa ruang dengan langkah spasi.
Evan Carroll
4
EvanCarroll Anda gagal karena \ s + jelas berbeda dengan + s +. \ s + akan cocok dengan '\ t \ t' atau '\ t \ t \ t' tetapi TIDAK '\ t'. Dan itu semua tentang, Anda tidak ingin mengganti setiap karakter spasi putih f-en tunggal.
watain
Saya lakukan. Digunakan untuk pencarian teks lengkap (dan tampilan cuplikan): Tidak ada tab acak, non-breakers atau thingymajigs, tolong.
T4NK3R
13

Saya memiliki metode ini, saya menyebutnya metode Derp karena kurangnya nama yang lebih baik.

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

Menjalankannya di JSPerf memberikan beberapa hasil yang mengejutkan.

Nenotlep
sumber
2
Saya akan malu sekali jika ternyata saya mengacaukan test case dan bukannya benar-benar cepat: D
Nenotlep
Memberikan test case ... Jawaban luar biasa!
Oytun
2
Ini membuat hari saya :-) Lucu bagaimana "derping" sering bekerja lebih baik daripada menjadi semua "pintar". "Derp split" tampaknya telah menendang pantatnya. Meski demikian, pantas mendapat upvoting.
Fred Gandt
13

Metode yang lebih kuat: Ini juga akan menghilangkan spasi awal dan akhir, jika ada. Misalnya:

// 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 !"

Contoh Anda tidak memiliki spasi tersebut tetapi itu adalah skenario yang sangat umum juga, dan jawaban yang diterima hanya memotongnya menjadi satu spasi, seperti: "... RED!", Yang bukan apa yang biasanya Anda perlukan.

Ethan
sumber
3
Saya menggunakan pola ini di PHP dan bekerja. $ parts = preg_split ("/ ^ \ + | | s + $ | \ s + (? = \ s) /", "Avenida Tancredo Neves, 745 Piso Térreo Sala");
Bruno Ribeiro
11

Lebih kuat:

fungsi trim (kata)
{
    word = word.replace (/ [^ \ x21- \ x7E] + / g, ''); // ubah karakter non-cetak menjadi spasi
    kembalikan word.replace (/ ^ \ s + | \ s + $ / g, ''); // hapus spasi memimpin / trailing
}
Chris
sumber
8

saya menyarankan

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

hanya untuk ruang
ATAU

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

untuk mengubah banyak pengembalian menjadi pengembalian tunggal juga.

Leonard Meagher
sumber
6

Saya tahu bahwa saya terlambat ke pesta, tetapi saya menemukan solusi yang bagus.

Ini dia:

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

Berikut ini adalah solusi alternatif jika Anda tidak ingin menggunakan replace (ganti spasi dalam string tanpa menggunakan ganti 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);
imos
sumber
5

Jawaban tidak terenkripsi komprehensif untuk pemula dkk.

Ini untuk semua boneka seperti saya yang menguji skrip yang ditulis oleh beberapa dari kalian yang tidak bekerja.

3 contoh berikut adalah langkah-langkah yang saya ambil untuk menghapus karakter khusus DAN spasi ekstra pada 3 situs web berikut (semuanya berfungsi dengan baik) {1. EtaVisa.com 2. EtaStatus.com 3. Tikun.com} jadi saya tahu ini berfungsi dengan baik.

Kami telah merantai ini bersama-sama dengan lebih dari 50 sekaligus dan TANPA masalah.

// Ini menghapus karakter khusus + 0-9 dan memungkinkan untuk huruf adil (huruf besar dan RENDAH)

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

// Ini menghapus karakter khusus dan memungkinkan untuk hanya huruf (huruf besar dan RENDAH) dan 0-9 DAN spasi

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

// Ini menghapus karakter khusus dan memungkinkan untuk hanya huruf (huruf besar dan RENDAH) dan 0-9 DAN spasi // .replace (/ \ s \ s + / g, "") pada akhirnya menghilangkan spasi berlebihan // ketika saya menggunakan tanda kutip tunggal, itu tidak berhasil.

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

::LANJUT:: Simpan # 3 sebagai a .js// Saya memanggil milik saya NoDoubles.js

:: NEXT :: Sertakan JS Anda ke halaman Anda

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

Sertakan ini di bidang formulir Anda :: seperti

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

Sehingga terlihat seperti ini

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

Ini akan menghapus karakter khusus, memungkinkan ruang tunggal dan menghapus ruang tambahan.

PatFoster
sumber
Apa yang terjadi disini? Formatnya terlihat sangat, sangat rusak.
Nenotlep
4

Juga kemungkinan:

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

Atau jika Anda juga ingin mengganti tab:

var replaced = string.replace(/\s+/g, " ");
Brian Campbell
sumber
1
menggunakan + tampaknya lebih bersih tetapi juga akan mengganti spasi tunggal dengan spasi tunggal, sedikit berlebihan dan saya tidak yakin tetapi itu dapat membuat masalah performace dengan teks yang lebih panjang.
ahmetunal
Saya cenderung menggunakan solusi tersingkat dan paling sederhana yang akan bekerja, dan hanya khawatir tentang optimasi semacam itu jika saya tahu bahwa saya harus cocok dengan string yang sangat besar, dan pada saat itu saya benar-benar akan mengukur solusi yang berbeda untuk melihat mana yang akan lebih cepat. Sulit untuk memprediksi sebelumnya apa yang akan tercepat tanpa pengujian; misalnya, dalam penerjemah JavaScript, beberapa ekspresi reguler yang rumit akan menyebabkan Anda beralih dari implementasi yang dikompilasi JIT cepat ke yang ditafsirkan lambat.
Brian Campbell
1

Jquery memiliki fungsi trim () yang pada dasarnya mengubah sesuatu seperti "FOo Bar" ini menjadi "FOo Bar".

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

Ini jauh lebih berguna karena secara otomatis menghilangkan ruang kosong di awal dan di akhir string juga. Tidak diperlukan regex.

Eryk Wróbel
sumber
3
Seperti yang Anda katakan, trim () menghilangkan spasi kosong di awal dan di akhir string, tetapi tidak di tengah-tengah string, jadi, itu tidak berfungsi dalam kasus ini, outputnya hanya akan menjadi "String saya dengan Banyak baris ". api.jquery.com/jQuery.trim
egvaldes
1

diganti tidak digunakan, string = string.split (/ \ W + /);

Lin
sumber
0
var myregexp = new RegExp(/ {2,}/g);

str = str.replace(myregexp,' ');
ahmetunal
sumber
0

Kita dapat menggunakan regex berikut ini dengan bantuan perintah sed system. Regex yang sama dapat digunakan dalam bahasa dan platform lain.

Tambahkan teks ke beberapa file say test

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

Kita bisa menggunakan regex berikut untuk mengganti semua spasi putih dengan spasi tunggal

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

Semoga ini melayani tujuan

minhas23
sumber
0

Coba ini untuk mengganti beberapa ruang dengan satu ruang.

<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>

Baca lebih lanjut @ Mengganti Beberapa Spasi dengan Spasi Tunggal

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

hasil:

"xxx df dfvdfv df dfv"
Toolkit
sumber
0

Untuk kontrol lebih lanjut Anda dapat menggunakan penggantian panggilan balik untuk menangani nilai.

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"
jackotonye
sumber
0

Script ini menghilangkan spasi putih (banyak spasi, tab, pengembalian, dll) antara kata dan trim:

// 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, ' ');
};
Oriol
sumber
0

'mouse pointer touch' .replace (/ ^ \ + | \ s + $ | (\ s) + / g, "$ 1") harus melakukan trik!

Ruwan Epage
sumber
0

Saya tahu kami harus menggunakan regex, tetapi selama wawancara, saya diminta untuk melakukannya TANPA MENGGUNAKAN REGEX.

@slightlytyler membantu saya datang dengan pendekatan di bawah ini.

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));

xSachinx
sumber
pertimbangkan: console.log (testStr.split ("") .filter (s => s.length) .join (""))
dpjanes