2016-09-22 27 views
5

Tôi có một chuỗi mà tôi muốn chia thành một mảng bằng cách sử dụng dấu phẩy làm dấu phân tách. Tôi không muốn các phần của chuỗi nằm giữa các dấu ngoặc đơn được phân chia mặc dù chúng có chứa dấu phẩy.Làm thế nào để tách chuỗi trong khi bỏ qua phần trong dấu ngoặc đơn?

Ví dụ:

"bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla" 

Sẽ trở thành:

["bibendum", "morbi", "non", "quam (nec, dui, luctus)", "rutrum", "nulla"] 

Nhưng khi tôi sử dụng một cơ sở .split(","), nó sẽ trả về:

["bibendum", " morbi", " non", " quam (nec", " dui", " luctus)", " rutrum", " nulla"] 

Tôi cần nó để trở về:

["bibendum", " morbi", " non", " quam (nec, dui, luctus)", " rutrum", " nulla"] 

Trợ giúp của bạn được đánh giá cao.

+0

Vì vậy, bạn muốn các từ ngoặc đơn và từ trước? – SilentLupin

+0

Có vẻ như bạn muốn tách bằng dấu phẩy nhưng bỏ qua dấu phẩy nằm trong dấu ngoặc đơn. – Kos

+0

Bạn có thể '.match (/ [^, \ s] + (\ s + \ ([^)] * \))?/G)' – Bergi

Trả lời

2

Thay vì tập trung vào những gì bạn làm không muốn nó thường dễ dàng hơn để thể hiện như một biểu hiện thường xuyên những gì bạn muốn, và để match rằng với một regex toàn cầu:

var str = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla"; 
str.match(/[^,]+(?:\(+*?\))?/g) // the simple one 
str.match(/[^,\s]+(?:\s+\([^)]*\))?/g) // not matching whitespaces 
3

Bạn không cần cụm từ thông dụng ưa thích cho việc này.

s="bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla" 
var current=''; 
var parenthesis=0; 
for(var i=0, l=s.length; i<l; i++){ 
    if(s[i] == '('){ 
    parenthesis++; 
    current=current+'('; 
    }else if(s[i]==')' && parenthesis > 0){ 
    parenthesis--; 
    current=current+')'; 
    }else if(s[i] ===',' && parenthesis == 0){ 
    console.log(current);current='' 
    }else{ 
    current=current+s[i]; 
    } 
} 
if(current !== ''){ 
    console.log(current); 
} 

Thay đổi bảng điều khiển.log cho kết nối mảng hoặc bạn muốn gì.

+1

Bạn có thể sửa đổi điều đó để đối phó với 's =" bibendum, morbi, non, quam (nec, dui, luctus (a, b (tùy ý, dấu ngoặc đơn, cấp), c)), rutrum, nulla "';) –

+3

Tôi sẽ;) chỉ thay đổi dấu ngoặc đơn thành một số, mỗi lần mở +1, mỗi lần đóng -1, khi 0 của nó có nghĩa là chúng tôi không nằm trong bất kỳ dấu ngoặc đơn nào – OPSXCQ

+0

Điểm thưởng nếu bạn làm theo cách đệ quy. – Orpheus

5
var regex = /,(?![^(]*\)) /; 
var str = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla"; 

var splitString = str.split(regex); 

Thông tin cho bạn đây. Giải thích về regex:

,  //Match a comma 
(?! //Negative look-ahead. We want to match a comma NOT followed by... 
[^(]* //Any number of characters NOT '(', zero or more times 
/) //Followed by the ')' character 
)  //Close the lookahead. 
+0

Cảm ơn @ Orpheus nhưng nó được đặt một không gian trước khi các yếu tố mảng> 0. Có sửa chữa cho điều đó? –

+0

@SultanShakir Đó là những gì mong đợi đầu ra trong câu hỏi của bạn, mặc dù. Bạn có thể muốn [chỉnh sửa] (http: // stackoverflow.com/posts/39647555/edit) để xóa các dấu cách – Bergi

+0

không nhìn nó đang làm việc này: '[" bibendum "," morbi "," non "," quam (nec, dui, luctus) "," rutrum " , "nulla"] ' ít nhất trong bảng điều khiển –

0
var start = "bibendum, morbi, non, quam (nec, dui, luctus), rutrum, nulla"; 
start = start.replace(/ /g,''); 
console.log(start); 

var front = start.substring(0,start.lastIndexOf('(')).split(','); 
var middle = '('+start.substring(start.lastIndexOf('(')+1,start.lastIndexOf(')'))+')'; 
var end = start.substring(start.lastIndexOf(')')+2,start.length).split(','); 
console.log(front) 
console.log(middle) 
console.log(end) 
return front.concat(middle,end); 
Các vấn đề liên quan