2009-04-08 69 views
11

EDIT: bất cứ ai có thể giúp tôi ra với một biểu thức chính quy cho một chuỗi như thế này ?:Làm thế nào để tách chuỗi bằng ',' trừ khi ',' nằm trong dấu ngoặc vuông bằng cách sử dụng Regex?

[Header 1], [Head,er 2], Header 3

vì vậy mà tôi có thể chia nhỏ này thành những phần như:

[Header 1]
[Head,er 2]
Header 3

Tôi đã nhận được như xa như sau:

(?<=,|^).*?(?=,|$) 

nào sẽ cho tôi:

[Header 1]
[Head
,er 2]
Header 3

+0

Cách triển khai CSV của con người mà thế giới cần ??? –

+0

Đây có phải là câu hỏi về bài tập về nhà không?Bởi vì tôi thấy đơn giản hơn khi sử dụng thao tác cũ đơn giản - về cơ bản: cho mỗi char: nếu char là dấu phẩy và không nằm trong dấu ngoặc thì hãy thêm chuỗi hiện tại vào danh sách –

Trả lời

15

Trong trường hợp này, việc phân tách trên dấu phân cách (dấu phẩy) dễ dàng hơn để khớp với mã thông báo (hoặc khối). Xác định dấu phẩy có delimiters mất một lookahead tương đối đơn giản:

,(?=[^\]]*(?:\[|$)) 

Mỗi lần bạn tìm thấy một dấu phẩy, bạn làm một lookahead cho một trong ba điều. Nếu bạn tìm thấy một khung hình vuông đóng trước, dấu phẩy nằm bên trong một cặp dấu ngoặc, do đó, nó không phải là dấu tách. Nếu bạn tìm thấy một khung mở hoặc kết thúc của dòng/chuỗi, đó là một dấu phân tách.

+0

Ah I thấy, tôi có thể thay thế dấu phẩy bằng một char đặc biệt khác và chia nhỏ chính xác bằng cách sử dụng. Điều đó sẽ làm việc cho tôi! Cảm ơn! – Nate

+0

Điều này làm việc hoàn hảo miễn là không có dấu ngoặc lồng nhau. Ví dụ, hoạt động như mong đợi cho '[a], [b], [c [d, e]]' nhưng thất bại trong '[a], [b], [c, [d, e]]'. Phù hợp với dấu phẩy bên cạnh c trong ví dụ cuối cùng. Làm thế nào điều này có thể được cải thiện để nó không phù hợp với điều đó? – matte

+0

Thực ra, để chính xác hơn cho '[a], [b, []' nó khớp với dấu phẩy sau b. Nếu có bất kỳ dấu ngoặc vuông mở nào trong '[]', thì mẫu này khớp với dấu phẩy trong dấu ngoặc vuông. – matte

1

Nó không đơn giản như thế này?

(?<=,|^)(?:[^,]|\[[^[]*\])* 
+0

Khi tôi sử dụng regex của mình, tôi nhận được mẫu sau: 'regex =/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) */ Cú phápError: Cụm từ thông dụng không hợp lệ:/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) * /: Nhóm không hợp lệ ' – starbeamrainbowlabs

2
(?<=,|^)\s*\[[^]]*\]\s*(?=,|$) 

sử dụng [] delimiters để lợi thế

6
\[.*?\] 

của bạn Hãy quên đi dấu phẩy, bạn không quan tâm đến họ. :)

+0

Câu trả lời hay, nhưng anh ấy đã thay đổi câu hỏi về bạn ... – dmckee

+0

Vâng, giờ tôi đã nhầm lẫn. Liệu nó thực sự nói Header hoặc là một số giữ chỗ? Các dấu ngoặc đơn có thực sự ở đó hay không? Nó bây giờ đã trở nên khó hiểu chính xác những gì các chuỗi đầu vào hợp lệ. –

+0

Xin lỗi về việc thay đổi nó, chuỗi đầu vào hợp lệ là [Một số văn bản], một số văn bản khác, [Tuy nhiên, lại văn bản] ... được chia thành [Một số văn bản]/Một số văn bản khác/[Tuy nhiên, lại văn bản] – Nate

1

Bạn có thể sử dụng một trong hai biểu thức chính quy để phù hợp với các giá trị bên trong dấu ngoặc:

\[[^\]*]\] 

Hoặc bạn sử dụng biểu thức chính quy này để phân chia các danh sách khung (sử dụng xem xung quanh khẳng định):

(?<=]|^)\s*,\s*(?=\[|$) 
Các vấn đề liên quan