2013-08-23 43 views
10

Tôi có chuỗi đơn giản này:Tách một chuỗi thành các nhóm gồm 2 ký tự bằng cách chia nhỏ?

"a1a2a3"

Có bất kỳ biểu thức regex mà có thể được sử dụng với split lệnh vì vậy nó sẽ tách chuỗi thành một cặp? :

["a1","a2","a3"]?

Tôi đã thử điều này:

"a1a2a3".split(/(?=..)/)

Nhưng nó trả ["a", "1", "a", "2", "a3"]

tái bút:

Tôi có thể làm điều đó với Match nhưng tìm kiếm (nếu có) cho biểu thức chính quy có thể giúp tôi sử dụng split.

+0

Động lực của bạn là gì khi muốn giữ lại các ký tự bằng cách sử dụng phương pháp có nghĩa là xóa ký tự? –

+0

mức độ này tăng bao nhiêu? a1-a100 ... xa hơn? a1-9, b1-9, v.v ...? – smerny

+0

Tôi nghĩ rằng tôi đã nhìn thấy câu trả lời với chia tách, một vài tháng trước, nhưng tôi không tìm thấy nó. –

Trả lời

9

split cho dù chuỗi dài:

str.split(/(?=(?:..)*$)/) 

split cho chuỗi dài lẻ, mục cuối cùng có ký tự đơn:

str.split(/(?=(?:..)*.$)/) 

Về cơ bản, những người nhìn này kiểm tra xem số ký tự phía trước có lẻ hay không. Nó tận dụng lợi thế của thực tế là số lượng ký tự ở phía trước tại tất cả các vị trí tách có cùng độ chẵn như độ dài của chuỗi.

Mẫu ở (thậm chí phiên bản) nhìn về phía trước là (?:..)*$, kiểm tra số ký tự còn lại (?:..)* trước khi kết thúc chuỗi $. (Lưu ý rằng nhóm không chụp (?:pattern) được sử dụng ở đây, nếu không, nhóm chụp sẽ tạo thêm mục nhập trong kết quả split). Giải thích tương tự áp dụng cho phiên bản lẻ.

Lưu ý rằng .excludes several new line characters: \n, \r, \u2028 hoặc \u2029. Nó sẽ tạo ra kết quả bất ngờ cho chuỗi chứa các ký tự như vậy. Thay thế . bằng [\s\S] (hoặc cấu trúc tương đương khác) để làm cho nó hoạt động cho mọi trường hợp.

+0

cuối cùng. điều này có thể được rút ngắn để điều kiện đơn nhất thành 1 biểu thức ... 'str.length% 2 == 0? /../:/../ ' –

+1

+1 điều này rất đẹp –

4

Tôi đã trả lời cuộc trò chuyện này. Bạn thực sự nên sử dụng String.prototype.match.

Có thể thực hiện với việc chia tách? Về mặt kỹ thuật, vâng. Bạn có thể chia nó bằng /(..)/ và sau đó lọc ra các chuỗi trống.

"a1a2a3".split(/(..)/).filter(function(a){ 
    return a !== ''; 
}); 
+7

hoặc '" a1a2a3 ".split (/(..)/). bộ lọc (Boolean)' –

+3

@CrazyTrain Nice! Hãy cắt bỏ một byte và sử dụng String để thay thế. '" a1a2a3 ".split (/(..)/). Bộ lọc (Chuỗi)' – nderscore

+0

@CrazyTrain ... tại sao tính năng này hoạt động? –

2

Tôi không chắc định dạng chuỗi đầu vào có thể là gì, nhưng tôi cho rằng đó là một số chữ cái theo sau là một số.

Nếu vậy bạn có thể thử:

var str = 'abc123d56efg8t5' 
var res = str.split(/([a-z]+[0-9]+)/).filter(Boolean); 

đầu ra:

["abc123", "d56", "efg8", "t5"] 
Các vấn đề liên quan