แทนที่ช่องว่างหลายช่องด้วยช่องว่างเดียวในสตริง JavaScript


191

ฉันมีสตริงที่มีช่องว่างพิเศษทุกครั้งที่มีพื้นที่ว่างมากกว่าหนึ่งช่องฉันก็อยากให้เป็นพื้นที่ ๆ เดียว

ใคร? ฉันพยายามค้นหา google แต่ไม่มีอะไรทำงานให้ฉัน

ขอบคุณ


2
ลบช่องว่างที่ซ้ำกันออกจากจุดสิ้นสุด / จุดเริ่มต้นหรือที่ใดก็ได้ในข้อความ
ninjagecko

คำตอบ:


371

บางสิ่งเช่นนี้

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)


31
@ ฉันโปรดอ่านคำถามอย่างระมัดระวัง: "ในแต่ละครั้งมีมากกว่าหนึ่งช่องว่างที่ฉันต้องการให้เป็นหนึ่งเดียว"
bjornd

5
ไม่ชัดเจนหรือ มันแทนที่ char มากกว่า 1 whitespace ด้วย 1 whitespace char (ผลลัพธ์ที่ต้องการ)
สงคราม

4
@CiaranG มันคือการแสดงออกปกติ
pomeroy

1
@Wardy ปิด :-) มันแทนที่หนึ่งหรือมากกว่าหนึ่งด้วยช่องว่าง (แต่แน่นอนผลลัพธ์ที่ต้องการ)
greenoldman

1
ถ้าใครต้องการแทนที่ช่องว่าง 1+ ด้วยช่องว่างแบบเดียวกัน (เช่นช่องว่าง 2+ ที่มีช่องว่างและขึ้นบรรทัดใหม่ 3 บรรทัดพร้อมกับขึ้นบรรทัดใหม่) หากมีทั้งบรรทัดใหม่และช่องว่างจะต้องถูกแทนที่ด้วยขึ้นบรรทัดใหม่ในขณะที่ถ้ามีทั้งช่องว่างและแท็บจะต้องถูกแทนที่ด้วย space
Tom

61

คุณสามารถเพิ่มสตริงเพื่อใช้พฤติกรรมเหล่านี้เป็นวิธีการเช่นเดียวกับใน:

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

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

ในตอนนี้คุณสามารถใช้รูปแบบที่สวยงามดังต่อไปนี้เพื่อสร้างสตริงที่คุณต้องการ:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
การเพิ่มต้นแบบต้นแบบของวัตถุมาตรฐานนั้นเป็นรูปแบบที่ถกเถียงกันมาก ฉันไม่แนะนำสำหรับคำถามพื้นฐานเช่นนี้
bjornd

@XavierJohn It's String พร้อม R ไม่ใช่การต่อย
LasagnaAndroid

20

การใช้นิพจน์ทั่วไปด้วยฟังก์ชันแทนที่ทำหน้าที่หลอกลวง

string.replace(/\s/g, "")

การแก้ปัญหานี้ผิดต่อคำถาม และฉันสงสัยจริงๆว่าทำไมคุณโพสต์ไว้สองวันหลังจากโพสต์วิธีแก้ปัญหาที่ดีกว่า ...
Sebastian Mach

ฉันคิดว่าในเวลานี้เฉพาะรหัสนี้ทำงานให้ฉัน ฉันไม่สามารถย้อนกลับไปยืนยันได้ เห็นได้ชัดว่าฉันจะได้ลองทางออกที่ดีที่สุดก่อน นอกจากนี้เมื่อตรวจสอบในคอนโซลโครเมี่ยมโซลูชั่นทั้งสองดูเหมือนจะทำงาน อย่างไรก็ตามที่น่าสนใจเมื่อฉันคัดลอกผลลัพธ์ไปยังกล่องแสดงความคิดเห็นนี้แสดงว่าโซลูชันของฉันไม่สามารถทำงานได้ในหลายพื้นที่ บางทีคุณสามารถช่วยฉันให้เข้าใจว่าทำไม ฉันคิดว่ามันเป็นข้อผิดพลาดของโครเมี่ยม? ลองใช้รหัสของฉันในคอนโซลโครเมี่ยมและแจ้งให้เราทราบ
Roger Gajraj

13

นี่คือโซลูชันที่ไม่ใช่ regex (เพื่อความสนุกสนาน):

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

มันแยกสตริงด้วยช่องว่างลบรายการอาร์เรย์ว่างทั้งหมดออกจากอาร์เรย์ (รายการที่มีมากกว่าหนึ่งช่องว่าง) และรวมคำทั้งหมดอีกครั้งในสตริงด้วยช่องว่างเดียวในระหว่างพวกเขา


12

ฉันคิดว่าคุณต้องการตัดช่องว่างจากจุดเริ่มต้นและ / หรือจุดสิ้นสุดของสตริง (แทนที่จะลบช่องว่างทั้งหมดหรือไม่

หากเป็นกรณีนี้คุณจะต้องมี regex ดังนี้:

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

การดำเนินการนี้จะลบช่องว่างทั้งหมดออกจากจุดเริ่มต้นหรือจุดสิ้นสุดของสตริง หากคุณต้องการตัดแต่งช่องว่างจากท้ายสุดเท่านั้น Regex จะมีลักษณะเช่นนี้แทน:

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

หวังว่าจะช่วย


4
ฉันชอบความเรียบง่ายของ regex ของคุณ @ Spudley แต่รหัสของคุณจะไม่แทนที่การทำงานของ whitespace ที่จุดเริ่มต้นและจุดสิ้นสุดด้วยอักขระช่องว่างเดียวใช่หรือไม่ ผมคิดว่าเป้าหมายคือการลบช่องว่างจากปลายทั้งหมดซึ่งในกรณีสตริงทดแทนควรจะแทน'' ' '
Randall Cook

8

jQuery.trim () ทำงานได้ดี

http://api.jquery.com/jQuery.trim/


14
เพียงจำไว้ว่านี่จะไม่ลบช่องว่างออกทั้งหมด การอ้างอิงเอกสาร: "ลบช่องว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง "
Jonik

6

ฉันรู้ว่าฉันไม่ควรใช้เวทมนตร์ในเรื่องใดเรื่องหนึ่ง แต่ด้วยรายละเอียดของคำถามฉันมักจะขยายออกเป็น

  • ฉันต้องการแทนที่ช่องว่างหลายรายการภายในสตริงด้วยช่องว่างเดียว
  • ... และ ... ฉันไม่ต้องการช่องว่างในการเริ่มต้นหรือสิ้นสุดของสตริง (ตัดแต่ง)

สำหรับสิ่งนี้ฉันใช้รหัสเช่นนี้ (วงเล็บบน regexp แรกมีเพียงเพื่อให้รหัสอ่านง่ายขึ้นอีกเล็กน้อย ... regexps อาจเป็นเรื่องเจ็บปวดเว้นแต่คุณจะคุ้นเคยกับมัน):

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

เหตุผลที่ใช้งานได้คือวิธีการใน String-object ส่งคืนวัตถุสตริงที่คุณสามารถเรียกใช้วิธีอื่น (เช่น jQuery และห้องสมุดอื่น ๆ ) วิธีที่กะทัดรัดมากขึ้นในการเขียนโค้ดหากคุณต้องการดำเนินการหลายวิธีในวัตถุเดียวอย่างต่อเนื่อง


+1 สำหรับตัวอย่าง "พร้อมใช้งาน" ฉันจะโพสต์ด้วยตัวเอง
d.raev

ว่าสิ่งที่ฉันกำลังมองหาน่ากลัว!
robertp

4

var x = "ทดสอบทดสอบทดสอบ" .split ("") .join (""); การแจ้งเตือน (x);


5
ใช้งานได้ แต่ไม่ใช่การเข้ารหัสอัจฉริยะ รหัสนี้ช้ากว่า RegEx ฉันสงสัยว่า Split () ไม่ใช้ RegEx เพื่อแยกสตริง!
Farandole

2

ลองสิ่งนี้

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

ผลลัพธ์จะเป็น

string 1

เกิดอะไรขึ้นที่นี่ก็คือว่ามันจะตัดช่องว่างนอกครั้งแรกที่ใช้แล้วตัดช่องว่างภายในใช้trim().replace(/\s+/g, ' ')


0

หากคุณต้องการ จำกัด ผู้ใช้ให้ช่องว่างในชื่อเพียงแค่สร้างคำสั่ง if และกำหนดเงื่อนไข เหมือนที่ฉันทำ:

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • สร้างฟังก์ชั่น JQuery
  • นี่คือเหตุการณ์การกดปุ่ม
  • เริ่มต้นตัวแปร
  • ให้เงื่อนไขเพื่อให้ตรงกับตัวละคร
  • แสดงข้อความเตือนสำหรับสภาพที่ตรงกันของคุณ

0

แล้วอันนี้ละ?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

เอาท์พุท "my test string with crazy stuff is cool "

อันนี้จะกำจัดแท็บใด ๆ เช่นกัน


\sแท็บได้รับความคุ้มครองแล้วโดย regex ที่ไม่จำเป็นโดยไม่จำเป็นอาจเขียน/\s+/gได้เช่นกัน
Anders Rabo Thorbeck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.