ฉันจะแบ่งสตริง JavaScript ด้วยช่องว่างหรือลูกน้ำได้อย่างไร


123

ถ้าฉันพยายาม

"my, tags are, in here".split(" ,")

ฉันได้รับสิ่งต่อไปนี้

[ 'my, tags are, in here' ]

ในขณะที่ฉันต้องการ

['my', 'tags', 'are', 'in', 'here']

4
คุณไม่ได้หมายถึงช่องว่างหรือลูกน้ำ?
KaptajnKold

1
เพื่อเป็นคำอธิบายสำหรับผลลัพธ์ที่คุณได้รับ: "my, tags are, in here".split(" ,")จะแบ่งสตริงเฉพาะโดยที่ช่องว่างตามด้วยเครื่องหมายจุลภาคเป็นตัวคั่น สตริงของคุณไม่มีลำดับนั้นจึงไม่ถูกแยกออก "my, tags are, in here".split(", ")ด้วยลำดับการแยกที่สลับอย่างน้อยจะแบ่งสตริงเดิมของคุณออกเป็นสามส่วนหลังจากแต่ละเครื่องหมายจุลภาคและเว้นวรรค หากคุณต้องการห้าส่วนคำตอบด้านล่างจะระบุสตริงที่ตรงกันเป็นนิพจน์ทั่วไปที่ตรงกับช่องว่างหรือลูกน้ำ
Jochem Schulenklopper

คำตอบ:


233

String.split ยังสามารถยอมรับนิพจน์ทั่วไป:

input.split(/[ ,]+/);

นิพจน์ทั่วไปนี้แยกตามลำดับของเครื่องหมายจุลภาคหรือช่องว่างอย่างน้อยหนึ่งช่องดังนั้นเช่นช่องว่างติดต่อกันหลายช่องหรือลำดับลูกน้ำ + ช่องว่างจะไม่ทำให้เกิดองค์ประกอบว่างในผลลัพธ์


22
เกี่ยวกับอะไร/,?\s+/?
Bergi

4
@Bergi: ทั้งสองอย่างเข้มงวดมากกว่าที่ฉันแนะนำ (อนุญาตให้ใช้จุลภาคเพียงอันเดียวข้างหน้า) และหลวมกว่า (แบ่งช่องว่างทั้งหมด) มากกว่าสิ่งที่ OP ขอ IMHO มันจะเป็นเพียงแค่เลว - spaces , before commasพิจารณาการป้อนข้อมูล
จอน

@ จอน: โอเคขึ้นอยู่กับความต้องการของ OP ฉันจะไม่ :-)
Bergi

11
+1 ฉันรู้ว่านี้เป็นเพียงเล็กน้อยเก่า \sแต่ทำไมใช้พื้นที่ว่างและไม่ได้ ฉันอาจมีเส้นแบ่งในหยดและ\sดูแลสิ่งเหล่านั้นด้วย
iambriansreed

6
FACEPALM หมายเหตุ: อย่าใส่เครื่องหมายคำพูดรอบ regex input.split("/[ ,]+/)"เช่นไม่ได้ใช้ ทิ้งคำพูดไว้ ( input.split(//)แทนinput.split("//")) แล้วคุณจะได้รับประสบการณ์ที่ดีขึ้นมาก เพราะแปลกจริงๆที่อาจใช้ได้เฉพาะกับตัวมันเอง (เพื่อสร้าง["input.split(\"", ")\""])
cod3monk3y

41

คำแนะนำในการใช้.split(/[ ,]+/)เป็นสิ่งที่ดี แต่ด้วยประโยคที่เป็นธรรมชาติไม่ช้าก็เร็วคุณจะได้รับองค์ประกอบว่างในอาร์เรย์ เช่น['foo', '', 'bar'].

ซึ่งก็ใช้ได้ถ้าเป็นกรณีการใช้งานของคุณ แต่ถ้าคุณต้องการกำจัดองค์ประกอบที่ว่างเปล่าคุณสามารถทำได้:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
นั่นเป็นการใช้ตัวสร้างวัตถุโดยนัยที่ชาญฉลาดมาก - แป้นพิมพ์คอมพิวเตอร์ของฉันเป็นบ้าเมื่อเช้านี้ฉันจะแก้ไขความคิดเห็นนี้ในภายหลัง แต่จุดที่เรียกใช้บูลีนเช่น 'Boolean ()' จะสร้างอินสแตนซ์ใหม่ของ [object Boolean] ด้วย a ค่าของเท็จเช่นเดียวกับที่เรียกใช้ 'บูลีนใหม่ ()' ซึ่งจะกรองการจับคู่ทั้งหมดออกเป็นลักษณะการทำงานเริ่มต้นนี้ Nice one :)
VLostBoy

"ประโยคธรรมชาติ" แปลว่าอะไรกันแน่? ฉันไม่สามารถเลียนแบบได้และฉันไม่เข้าใจว่าสิ่งนี้ควรทำอย่างไร
cregox

มันอธิบายโดย @VLostBoy เมื่อตัวBoolean()สร้างถูกเรียกใช้ค่าใด ๆ มันจะร่ายค่านั้นเป็นบูลีน - จริงหรือเท็จ ดังนั้นค่าที่เป็นเท็จจะถูกกรองออกจากอาร์เรย์รวมถึงสตริงว่าง
jonschlinkert

1
btw คุณสามารถใช้ตัวสร้างโดยนัยสำหรับความสนุกอื่น ๆ ที่คล้ายกันเช่น[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)ผลตอบแทน["foo", "bar", "foobar", ""](เนื่องจากมีเครื่องหมายจุลภาคห้อยอยู่ในตอนท้าย) ขอบคุณ!
RafałCieślak

37

คุณสามารถใช้ regex เพื่อจับพื้นที่สีขาวตามความยาวและสิ่งนี้จะเป็นดังนี้:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

ระวังชั้นนำ / /\s+/ต่อท้ายช่องว่างเมื่อใช้ ตัวอย่างเช่น'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]. ถ้าคุณ.trim()เป็นคนแรกคุณจะดี
Jordan Dodson


4

input.split(/\s*[\s,]\s*/)

\s*จับคู่อักขระเว้นวรรคสีขาวตั้งแต่ศูนย์ขึ้นไป (ไม่ใช่เฉพาะช่องว่าง แต่รวมถึงแท็บและบรรทัดใหม่ด้วย)

... [\s,]จับคู่อักขระช่องว่างหนึ่งตัวหรือหนึ่งลูกน้ำ

หากคุณต้องการหลีกเลี่ยงองค์ประกอบว่างจากอินพุตเช่น"foo,bar,,foobar"นี้จะทำเคล็ดลับ:

input.split(/(\s*,?\s*)+/)

+ตรงกับหนึ่งหรือมากกว่าของตัวละครก่อนหรือกลุ่ม

แก้ไข:

เพิ่ม?หลังเครื่องหมายจุลภาคซึ่งตรงกับศูนย์หรือหนึ่งลูกน้ำ

แก้ไข 2:

ปรากฎว่าการแก้ไข 1 เป็นข้อผิดพลาด ซ่อมมัน. ตอนนี้ต้องมีอย่างน้อยหนึ่งลูกน้ำหรือหนึ่งช่องว่างเพื่อให้นิพจน์ค้นหารายการที่ตรงกัน


nop นั่นไม่ดี นี่คือผลลัพธ์: ["my", "tags are", "in here"]
gabitzish

ดูเหมือนว่าจะแยกตัวละครแต่ละตัว
Marco

@Marco อ๊ะ. น่าจะทดสอบก่อนที่จะทำการแก้ไขครั้งสุดท้าย ฉันมีตอนนี้และเวลานี้มันควรจะได้ผลจริงๆ
KaptajnKold

อืมดีกว่าคำตอบที่ได้รับการยอมรับอย่างไร "foo,bar,foobar".split(/[ ,]+/)ผลตอบแทน["foo", "bar", "foobar"]เช่นกัน
RafałCieślak

1
@KaptajnKold โอ้ฉันฟังไม่ทันขอบคุณที่ตอบ!
RafałCieślak

2

เมื่อฉันต้องการพิจารณาอักขระพิเศษเช่นเครื่องหมายจุลภาคของคุณ (ในกรณีของฉันแต่ละโทเค็นอาจถูกป้อนด้วยเครื่องหมายคำพูด) ฉันจะสร้าง string.replace () เพื่อเปลี่ยนตัวคั่นอื่น ๆ ให้เป็นช่องว่างแล้วแบ่งช่องว่าง


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.