2013-01-08 29 views
6

Đây là trường hợp:chia bởi một nhân vật trong JavaScript nhưng không những tiếp giáp

var stringExample = "hello=goodbye==hello"; 
var parts = stringExample.split("="); 

Output:

hello,goodbye,,hello 

Tôi cần Output này:

hello,goodbye==hello 

Tiếp giáp/ký tự lặp đi lặp lại phải được bỏ qua, chỉ cần lấy "=" để tách.

Có thể một số regex?

+1

Sẽ luôn có các ký tự chữ và số xung quanh '=' s mà bạn muốn chia nhỏ không? Hoặc có thể có một cái gì đó như 'hello: =! Goodbye' nên được chia thành' hello: 'và'! Goodbye'? –

Trả lời

6

Bạn có thể sử dụng một regex:

var parts = stringExample.split(/\b=\b/); 

\b kiểm tra các ranh giới từ.

+0

Tôi nghĩ rằng chỉ có dấu hiệu bình đẳng nên được bỏ qua, không phải bất kỳ ký tự không phải từ nào. – Bergi

+0

@Bergi Tôi không chắc mình có gặp vấn đề của bạn hay không. Bạn có thể đưa ra một ví dụ? –

+0

Cảm ơn, giải pháp tuyệt vời! –

3

Rất có thể, @dystroys là câu trả lời bạn đang tìm kiếm. Nhưng nếu bất kỳ ký tự nào ngoài chữ và số (A-Z, a-z, 0-9 hoặc _) có thể bao quanh "tách ="), thì giải pháp của anh ấy sẽ không hoạt động. Ví dụ, chuỗi

It's=risqué=to=use =Unicode!=See? 

sẽ được chia thành

"It's", "risqué=to", "use Unicode!=See?" 

Vì vậy, nếu bạn cần phải tránh điều đó, bạn thường sử dụng một sự khẳng định lookbehind:

result = subject.split(/(?<!=)=(?!=)/); // but that doesn't work in JavaScript! 

Vì vậy, mặc dù điều này sẽ chỉ được chia trên = s, bạn không thể sử dụng vì JavaScript không hỗ trợ giao diện (?<!...) quả quyết.

May mắn thay, bạn luôn có thể thay đổi một hoạt động split() thành một match() hoạt động toàn cầu bằng cách kết hợp tất cả những gì được phép giữa delimiters:

result = subject.match(/(?:={2,}|[^=])*/g); 

sẽ cung cấp cho bạn

"It's", "risqué", "to", "use ", "Unicode!", "See?" 
+0

+1 Tôi đã tự hỏi tại sao lookbehind trong 'split' tôi đã thử nghiệm đã không làm việc. Là "không hoạt động trong Javascript!" tài liệu ở đâu đó? –

+0

@dystroy: http://www.regular-expressions.info/refflavors.html là tài nguyên truy cập của tôi cho điều này (hoặc RegexBuddy). –

+2

'match' thường không tương đương với' split' theo cách nó xử lý các chuỗi bắt đầu/kết thúc bằng dấu phân tách. Ngoài ra, nó có thể trả về 'null'. Việc chuyển đổi không phải là tầm thường :-) Và ít nhất bạn sẽ cần phải sử dụng '*' thay vì '+' – Bergi

-1

Như xấp xỉ đầu tiên vào một giải pháp có thể có thể là:

".*[^=]=[^=].*" 

Lưu ý rằng đây chỉ là regex, nếu bạn muốn sử dụng nó với egrep, sed, java regex hoặc bất cứ điều gì, chăm sóc nếu một cái gì đó cần phải được thoát.

BEWARE !: Đây là lần đầu tiên gần đúng, điều này có thể được cải thiện. Lưu ý rằng, ví dụ, regex này sẽ không khớp với chuỗi này "=" (null - bằng - null).

+0

Bạn có thể sử dụng chính xác regex này trong trường hợp của OP không? –

+0

@dystroy 'exact' không phải là động từ, nhưng nhìn vào hồ sơ của bạn, tôi thấy bạn phải nói tiếng Pháp. – jackcogdill

+0

@ dystroy Tôi không hiểu bạn. OP có nghĩa là gì? Nếu bạn đang yêu cầu một ví dụ về cách sử dụng regex đó trong/với một chương trình, hãy xem nó. Nội dung của một tập tin: hello = thế giới hell0 == w0rld tạm biệt = == độc ác trên thế giới by3 == cru3l = w0rld = == === – Ole

Các vấn đề liên quan