2012-04-22 24 views
87

tôi đã không nhận được một regex tối ưu mà chia cho tôi một chuỗi căn cứ vào không gian đầu tiên xảy ra trắng:Chia chuỗi vào ngày đầu tiên trắng không gian xảy ra

var str="72 tocirah sneab"; 

tôi cần phải nhận được:

72 
tocirah sneab 
+1

Ý anh là gì bằng cách "tối ưu hóa"? Liệu nó * có * là một regex? – Deestan

+0

Không, nếu có cách nào khác, hãy chào mừng bạn :) – Luca

+0

Vui lòng dành thời gian để cuộn xuống câu trả lời của @ georg - http://stackoverflow.com/a/10272828/93910 –

Trả lời

218

Nếu bạn chỉ quan tâm đến ký tự khoảng trắng (không phải tab hoặc các ký tự khoảng trắng khác) và chỉ quan tâm đến mọi thứ trước khoảng trống đầu tiên và mọi thứ sau không gian đầu tiên, bạn có thể thực hiện nó mà không có cụm từ thông dụng như sau:

str.substr(0,str.indexOf(' ')); // "72" 
str.substr(str.indexOf(' ')+1); // "tocirah sneab" 

Lưu ý rằng nếu không có không gian nào cả, thì dòng đầu tiên sẽ trả về một chuỗi trống và dòng thứ hai sẽ trả về toàn bộ chuỗi. Hãy chắc chắn rằng đó là hành vi mà bạn muốn trong tình huống đó (hoặc tình huống đó sẽ không phát sinh).

+0

Điều này có hiệu quả hơn 'str. split ('') [0] '? – Growler

10
var arr = [];    //new storage 
str = str.split(' ');  //split by spaces 
arr.push(str.shift()); //add the number 
arr.push(str.join(' ')); //and the rest of the string 

//arr is now: 
["72","tocirah sneab"]; 

nhưng tôi vẫn nghĩ rằng có một cách nhanh hơn.

32

Javascript không hỗ trợ lookbehinds, do đó, split là không thể. match công trình:

str.match(/^(\S+)\s(.*)/).slice(1) 

Một lừa:

str.replace(/\s+/, '\x01').split('\x01') 

thế nào về:

[str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')] 

và tại sao không

reverse = function (s) { return s.split('').reverse().join('') } 
reverse(str).split(/\s(?=\S+$)/).reverse().map(reverse) 

hoặc có thể

re = /^\S+\s|.*/g; 
[].concat.call(re.exec(str), re.exec(str)) 
+2

Một hướng dẫn vi mô regex tốt :) – esp

5

Bạn cũng có thể sử dụng .replace chỉ thay thế sự xuất hiện đầu tiên,

​str = str.replace(' ','<br />'); 

Rời ra/g.

DEMO

+3

@DannyHerran .. Không, nó sẽ không? Bạn đã từng thử nghiệm mã chưa? Không có/g sửa đổi. Nó không phải là toàn cầu. [Thử kiểm tra mã trước khi bạn có ý định biết nó làm gì] (http://jsfiddle.net/LWCZj/). Thử nghiệm trong ba trình duyệt chính là tốt. Tôi muốn biết tại sao bạn nghĩ bạn làm gì. – Daedalus

1

Bất cứ khi nào tôi cần để có được một lớp từ một danh sách các lớp hoặc một phần của một tên lớp hoặc id, tôi luôn luôn sử dụng split() sau đó, hoặc làm cho nó đặc biệt với chỉ số mảng hoặc, thường xuyên nhất trong trường hợp của tôi, pop() để lấy phần tử cuối cùng hoặc shift() để lấy phần tử đầu tiên.

Ví dụ này được lớp học của div "gallery_148 ui-sắp xếp được" và trả về id gallery 148.

var galleryClass = $(this).parent().prop("class"); // = gallery_148 ui-sortable 
var galleryID = galleryClass.split(" ").shift(); // = gallery_148 
galleryID = galleryID.split("_").pop(); // = 148 
//or 
galleryID = galleryID.substring(8); // = 148 also, but less versatile 

tôi chắc chắn rằng nó có thể được đầm vào dòng ít nhưng tôi rời nó mở rộng để có thể đọc.

0

Tôi cần kết quả hơi khác.

Tôi muốn từ đầu tiên và những gì từng đến sau nó - ngay cả khi nó trống.

str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' ')); 
str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1); 

vì vậy nếu đầu vào là oneword bạn nhận được oneword''.

Nếu đầu vào là one word and some more bạn nhận được oneword and some more.

13

Trong ES6 bạn cũng có thể

let [first, ...second] = str.split(" ") 
second = second.join(" ") 
+0

Tôi thích điều này khá một chút và nó hoạt động tốt nhưng hiệu suất khôn ngoan nó khá xấu với giải pháp "chuỗi con" được bỏ phiếu nhiều nhất. chỉ cần thử nghiệm nó và nó là khoảng 10 lần chậm hơn. – pootzko

2

Chỉ cần chia chuỗi thành một mảng và dán các phần bạn cần cùng nhau. Cách tiếp cận này rất linh hoạt, nó hoạt động trong nhiều tình huống và rất dễ dàng để giải thích. Ngoài ra, bạn chỉ cần một cuộc gọi chức năng.

arr = str.split(' ');    // ["72", "tocirah", "sneab"] 
strA = arr[0];     // "72" 
strB = arr[1] + ' ' + arr[2];  // "tocirah sneab" 

Ngoài ra, nếu bạn muốn anh đào-chọn những gì bạn cần trực tiếp từ chuỗi bạn có thể làm một cái gì đó như thế này:

strA = str.split(' ')[0];     // "72"; 
strB = str.slice(strA.length + 1);   // "tocirah sneab" 

Hoặc như thế này:

strA = str.split(' ')[0];     // "72"; 
strB = str.split(' ').splice(1).join(' '); // "tocirah sneab" 

Tuy nhiên tôi đề nghị ví dụ đầu tiên.

bản demo làm việc: giải pháp jsbin

+0

Như thế này! Có "khuyết điểm"? – iglesiasedd

+1

Cảm ơn! Không phải là tôi biết. – Rotareti

3

Georg là tốt đẹp, nhưng phá vỡ nếu chuỗi không chứa bất kỳ khoảng trắng. Nếu dây của bạn có một cơ hội không chứa khoảng trắng, nó là an toàn hơn để sử dụng .split và nhóm chụp như vậy:

str_1 = str.split(/\s(.+)/)[0]; //everything before the first space 
str_2 = str.split(/\s(.+)/)[1]; //everything after the first space 
Các vấn đề liên quan