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
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
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).
Điều này có hiệu quả hơn 'str. split ('') [0] '? – Growler
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.
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))
Một hướng dẫn vi mô regex tốt :) – esp
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.
@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
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.
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
và ''
.
Nếu đầu vào là one word and some more
bạn nhận được one
và word and some more
.
Trong ES6 bạn cũng có thể
let [first, ...second] = str.split(" ")
second = second.join(" ")
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
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
Như thế này! Có "khuyết điểm"? – iglesiasedd
Cảm ơn! Không phải là tôi biết. – Rotareti
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
muộn để các trò chơi, tôi biết nhưng có vẻ là một cách rất đơn giản để làm điều này:
var str = "72 tocirah sneab";
var arr = str.split(/ (.*)/);
này sẽ để lại arr[0]
với "72"
và arr[1]
với "tocirah sneab"
.
Để tham khảo:
Ý anh là gì bằng cách "tối ưu hóa"? Liệu nó * có * là một regex? – Deestan
Không, nếu có cách nào khác, hãy chào mừng bạn :) – Luca
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 –