Làm cách nào để chia một chuỗi JavaScript bằng khoảng trắng hoặc dấu phẩy?


123

Nếu tôi cố gắng

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

Tôi nhận được những thứ sau

[ 'my, tags are, in here' ]

Trong khi tôi muốn

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

4
ý bạn không phải là khoảng trắng hay dấu phẩy?
KaptajnKold

1
Như một lời giải thích cho kết quả mà bạn nhận được: "my, tags are, in here".split(" ,")sẽ chỉ chia chuỗi trong đó khoảng trắng theo sau dấu phẩy là dấu phân cách. Chuỗi của bạn không chứa chuỗi đó, do đó nó không được tách. "my, tags are, in here".split(", ")với trình tự tách được hoán đổi ít nhất sẽ chia chuỗi ban đầu của bạn thành ba phần, sau mỗi dấu phẩy-và-khoảng trắng. Nếu bạn muốn có năm phần, các câu trả lời bên dưới chỉ định chuỗi đối sánh là một biểu thức chính quy khớp với dấu cách hoặc dấu phẩy.
Jochem Schulenklopper,

Câu trả lời:


233

String.split cũng có thể chấp nhận một biểu thức chính quy:

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

Regex cụ thể này phân tách trên một chuỗi một hoặc nhiều dấu phẩy hoặc dấu cách, để ví dụ: nhiều dấu cách liên tiếp hoặc một chuỗi dấu phẩy + dấu cách không tạo ra các phần tử trống trong kết quả.


22
Về /,?\s+/thì sao?
Bergi

4
@Bergi: Chà, nó vừa nghiêm ngặt hơn những gì tôi đề xuất (chỉ cho phép một dấu phẩy ở phía trước) vừa lỏng lẻo hơn (phân chia trên tất cả khoảng trắng) so với những gì OP yêu cầu. IMHO nó sẽ đơn giản là tệ hơn - hãy xem xét đầu vào spaces , before commas.
Jon

@Jon: OK, điều đó tùy thuộc vào nhu cầu của OP. Tôi sẽ không cam lòng :-)
Bergi

11
+1 Tôi biết điều này hơi cũ nhưng tại sao lại sử dụng khoảng trắng và không \s. Tôi có thể có một số ngắt dòng trong đốm màu và cũng \schăm sóc chúng.
iambrianreed

6
LƯU Ý FACEPALM: không đặt dấu ngoặc kép xung quanh regex. ví dụ: Không sử dụng input.split("/[ ,]+/)". Bỏ qua các trích dẫn ( input.split(//)thay vì input.split("//")) và bạn sẽ có trải nghiệm tốt hơn nhiều. Bởi vì kỳ lạ, điều đó thực sự có thể sẽ chỉ hoạt động trên chính nó (để tạo ["input.split(\"", ")\""]).
cod3monk3y

41

Đề xuất sử dụng .split(/[ ,]+/)là tốt, nhưng với các câu tự nhiên, sớm muộn gì bạn cũng nhận được các phần tử trống trong mảng. vd ['foo', '', 'bar'].

Sẽ tốt nếu điều đó ổn cho trường hợp sử dụng của bạn. Nhưng nếu bạn muốn loại bỏ các phần tử trống, bạn có thể làm:

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

6
Đó là cách sử dụng rất thông minh các hàm tạo ngầm đối tượng gốc - bàn phím máy tính của tôi bị điên sáng nay - Tôi sẽ chỉnh sửa nhận xét này sau - nhưng điểm đang gọi Boolean như 'Boolean ()' sẽ tạo một phiên bản mới của [object Boolean] với một giá trị của false, giống như sẽ gọi 'new Boolean ()'. Điều đó sẽ lọc ra tất cả các kết quả phù hợp với hành vi mặc định này.
Tuyệt vời

chính xác thì bạn hiểu "câu tự nhiên" là gì? Tôi không thể mô phỏng nó cũng như không hiểu điều này phải làm.
cregox

Nó được giải thích bởi @VLostBoy. Khi hàm Boolean()tạo được gọi trên bất kỳ giá trị nào, nó chuyển giá trị đó thành boolean - true hoặc false. Do đó, bất kỳ giá trị giả nào sẽ được lọc khỏi mảng, bao gồm cả các chuỗi trống.
jonschlinkert

1
btw, bạn có thể sử dụng nhà thầu tiềm ẩn cho công cụ thú vị khác tương tự, như[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)trả về ["foo", "bar", "foobar", ""](vì dấu phẩy lủng lẳng ở cuối), cảm ơn!
Rafał Cieślak

37

bạn có thể sử dụng regex để bắt bất kỳ độ dài nào của khoảng trắng và điều này sẽ giống như sau:

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" 

Cẩn thận với khoảng trắng đầu / cuối khi sử dụng /\s+/. Ví dụ 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Nếu bạn .trim()xâu chuỗi trước, bạn sẽ giỏi.
Jordan Dodson

12
"my, tags are, in here".split(/[ ,]+/)

kết quả là :

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

4

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

\s*Khớp với không hoặc nhiều ký tự khoảng trắng (không chỉ dấu cách mà còn cả tab và dòng mới).

... [\s,]khớp với một ký tự khoảng trắng hoặc một dấu phẩy

Nếu bạn muốn tránh các phần tử trống từ đầu vào như "foo,bar,,foobar", điều này sẽ thực hiện thủ thuật:

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

Các +kết quả khớp với một hoặc nhiều ký tự hoặc nhóm đứng trước.

Biên tập:

Được thêm vào ?sau dấu phẩy khớp với 0 hoặc một dấu phẩy.

Chỉnh sửa 2:

Hóa ra chỉnh sửa 1 là một sai lầm. Đã sửa nó. Bây giờ phải có ít nhất một dấu phẩy hoặc một dấu cách để biểu thức tìm được kết quả phù hợp.


Không. Điều đó không tốt. Đây là kết quả đầu ra: ["my", "tags are", "in here"]
gabitzish

nó dường như tách ra trên mỗi ký tự.
Marco

@Marco Rất tiếc. Có lẽ nên kiểm tra nó trước khi tôi thực hiện chỉnh sửa cuối cùng. Tôi có bây giờ, và lần này nó thực sự nên hoạt động.
KaptajnKold

Hmm, làm thế nào điều này tốt hơn câu trả lời được chấp nhận? "foo,bar,foobar".split(/[ ,]+/)lợi nhuận ["foo", "bar", "foobar"]là tốt.
Rafał Cieślak

1
@KaptajnKold Ồ, tôi chưa hiểu, cảm ơn bạn đã trả lời!
Rafał Cieślak

2

Khi tôi muốn tính đến các ký tự bổ sung như dấu phẩy của bạn (trong trường hợp của tôi, mỗi mã thông báo có thể được nhập bằng dấu ngoặc kép), tôi sẽ thực hiện một string.replace () để thay đổi các dấu phân cách khác thành khoảng trống và sau đó tách trên khoảng trắng.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.