2012-04-27 50 views
80

Nếu tôi cố gắngLàm cách nào để tách chuỗi JavaScript bằng khoảng trắng hoặc dấu phẩy?

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

tôi nhận được sau

[ 'my, tags are, in here' ] 

Trong khi tôi muốn

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

don' t bạn có nghĩa là khoảng trắng * hoặc * dấu phẩy? – KaptajnKold

+1

Như một lời giải thích cho kết quả mà bạn đang nhận được: '" của tôi, thẻ, ở đây ".split (", ")' sẽ tách chuỗi chỉ nơi một dấu cách _followed_ bằng dấu phẩy là dấu tách. Chuỗi của bạn không chứa chuỗi đó, do đó nó không được chia nhỏ. '" các thẻ của tôi, ở đây ".split (", ")' với chuỗi phân tách được hoán đổi ít nhất sẽ tách chuỗi gốc của bạn thành ba phần, sau mỗi dấu phẩy và dấu cách. Nếu bạn muốn năm phần, câu trả lời dưới đây chỉ định chuỗi đối sánh dưới dạng cụm từ thông dụng khớp với dấu cách _or_ dấu phẩy. –

Trả lời

160

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 gồm 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 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ả.

+16

Còn về '/,? \ S + /'? – Bergi

+1

Điều đó cũng hoạt động. – gabitzish

+4

@ Bergi: Vâng, nó nghiêm ngặt hơn cả những gì tôi đề nghị (chỉ một dấu phẩy cho phép, ở phía trước) và 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ẽ chỉ đơn giản là tồi tệ hơn - xem xét đầu vào 'không gian, trước khi dấu phẩy'. – Jon

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

kết quả là:

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

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

... \s* trận zero hoặc các ký tự khoảng trắng hơn (không chỉ là không gian, mà còn các tab và newlines).

... [\s,] phù hợp với một nhân vật không gian màu trắng hoặc một dấu phẩy

Nếu bạn muốn tránh các yếu tố trống từ đầu vào như "foo,bar,,foobar", điều này sẽ làm các trick:

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

Các + trận đấu một hoặc nhiều ký tự hoặc nhóm trước đó.

Edit:

Added ? sau dấu phẩy mà phù hợp với không hoặc một dấu phẩy.

Chỉnh sửa 2:

Tắt chỉnh sửa 1 là một sai lầm. Sửa lỗi. 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 thấy kết quả phù hợp.

+0

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

+0

Nó phải được sửa ngay bây giờ. – KaptajnKold

+0

dường như chia nhỏ từng ký tự. – Marco

1

Khi tôi muốn tính đến các ký tự thừa như dấu phẩy (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ẽ làm một string.replace() để thay đổi các dấu phân tách khác thành khoảng trống và sau đó chia nhỏ khoảng trống.

28

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

Điều này sẽ ổn nếu trường hợp sử dụng của bạn ổn. Nhưng nếu bạn muốn để thoát khỏi các yếu tố có sản phẩm nào bạn có thể làm:

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

Thats một cách sử dụng rất thông minh của các constructor ngầm đối tượng bản địa - bàn phím máy tính của tôi là điên sáng nay- Tôi sẽ chỉnh sửa chú thích sau - nhưng điểm gọi Boolean như 'Boolean()' sẽ xây dựng một thể hiện mới của [đối tượng Boolean] một giá trị sai, giống như sẽ gọi 'Boolean() mới'. Đ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. Nice one :) – VLostBoy

+0

cảm ơn! Tôi đã tìm thấy nó là một mẹo siêu hữu ích – jonschlinkert

+0

chính xác những gì bạn có ý nghĩa bởi "câu tự nhiên"? Tôi không thể thi đua nó cũng không hiểu tôi phải làm gì. – cregox

11

bạn có thể sử dụng regex để bắt bất kỳ khoảng không gian màu trắng, và điều này sẽ như thế nào:

 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ác vấn đề liên quan